<!DOCTYPE html>
<html lang="en-US" dir="ltr">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>IDEA 学习⭐⭐ | VitePress</title>
    <meta name="description" content="A VitePress site">
    <link rel="preload stylesheet" href="/notebook/assets/style.3dbfd0c2.css" as="style">
    
    <script type="module" src="/notebook/assets/app.8aaa4cbe.js"></script>
    <link rel="preload" href="/notebook/assets/inter-roman-latin.2ed14f66.woff2" as="font" type="font/woff2" crossorigin="">
    <link rel="modulepreload" href="/notebook/assets/chunks/framework.1336c4e5.js">
    <link rel="modulepreload" href="/notebook/assets/chunks/theme.20cddc0c.js">
    <link rel="modulepreload" href="/notebook/assets/IDEA_IDEA基础.md.6f2f9638.lean.js">
    <script id="check-dark-light">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
  </head>
  <body>
    <div id="app"><div class="Layout" data-v-255ec12d><!--[--><!--]--><!--[--><span tabindex="-1" data-v-ae3e3f51></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-ae3e3f51> Skip to content </a><!--]--><!----><header class="VPNav" data-v-255ec12d data-v-7e5bc4a5><div class="VPNavBar has-sidebar" data-v-7e5bc4a5 data-v-0937f67c><div class="container" data-v-0937f67c><div class="title" data-v-0937f67c><div class="VPNavBarTitle has-sidebar" data-v-0937f67c data-v-86d1bed8><a class="title" href="/notebook/" data-v-86d1bed8><!--[--><!--]--><!--[--><img class="VPImage logo" src="/notebook/Vue.png" alt data-v-8426fc1a><!--]--><!--[-->任硕的文档<!--]--><!--[--><!--]--></a></div></div><div class="content" data-v-0937f67c><div class="curtain" data-v-0937f67c></div><div class="content-body" data-v-0937f67c><!--[--><!--]--><div class="VPNavBarSearch search" style="--vp-meta-key:&#39;Meta&#39;;" data-v-0937f67c><!--[--><!----><div id="docsearch"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg class="DocSearch-Search-Icon" width="20" height="20" viewBox="0 0 20 20" aria-label="search icon"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-0937f67c data-v-7f418b0f><span id="main-nav-aria-label" class="visually-hidden" data-v-7f418b0f>Main Navigation</span><!--[--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>Java学前端</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/HTML+JS.html" data-v-2f2cfafc><!--[-->HTML+JS<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/CSS.html" data-v-2f2cfafc><!--[-->CSS<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/Vue2+%E7%BB%84%E4%BB%B6.html" data-v-2f2cfafc><!--[-->Vue2+组件<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/Vue3+%E7%BB%84%E4%BB%B6.html" data-v-2f2cfafc><!--[-->Vue3+组件<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/Java%E5%AD%A6%E5%89%8D%E7%AB%AF/React.html" data-v-2f2cfafc><!--[-->React<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>软件测试</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/%E6%B5%8B%E8%AF%95%E5%9F%BA%E7%A1%80.html" data-v-2f2cfafc><!--[-->测试基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95.html" data-v-2f2cfafc><!--[-->压力测试<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>多线程</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E5%B9%B6%E5%8F%91%20&amp;%20%E5%A4%9A%E7%BA%BF%E7%A8%8B/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-2f2cfafc><!--[-->基础篇<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E5%B9%B6%E5%8F%91%20&amp;%20%E5%A4%9A%E7%BA%BF%E7%A8%8B/%E5%B9%B6%E5%8F%91%E5%AE%8C%E5%96%84.html" data-v-2f2cfafc><!--[-->进阶篇<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>开发工具</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/Chrome.html" data-v-2f2cfafc><!--[-->Chrome<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link active" href="/notebook/IDEA/IDEA%E5%9F%BA%E7%A1%80.html" data-v-2f2cfafc><!--[-->IDEA基础<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/IDEA%E6%8F%92%E4%BB%B6.html" data-v-2f2cfafc><!--[-->IDEA插件<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/IDEA/VS%20Code.html" data-v-2f2cfafc><!--[-->VS Code<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-7f418b0f data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-a7b5672a><span class="text" data-v-a7b5672a><!----><span data-v-a7b5672a>消息中间件</span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="text-icon" data-v-a7b5672a><path d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"></path></svg></span></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><div class="items" data-v-e7ea1737><!--[--><!--[--><div class="VPMenuGroup" data-v-e7ea1737 data-v-69e747b5><!----><!--[--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/RabbitMQ.html" data-v-2f2cfafc><!--[-->RabbitMQ<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/RocketMQ.html" data-v-2f2cfafc><!--[-->RocketMQ<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/Kafka.html" data-v-2f2cfafc><!--[-->Kafka<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-69e747b5 data-v-2f2cfafc><a class="VPLink link" href="/notebook/%E6%B6%88%E6%81%AF%E4%B8%AD%E9%97%B4%E4%BB%B6/Canal.html" data-v-2f2cfafc><!--[-->Canal<!--]--></a></div><!--]--><!--]--></div><!--]--><!--]--></div><!--[--><!--]--></div></div></div><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-0937f67c data-v-f6a63727><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="toggle dark mode" aria-checked="false" data-v-f6a63727 data-v-82b282f1 data-v-f3c41672><span class="check" data-v-f3c41672><span class="icon" data-v-f3c41672><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-82b282f1><path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path><path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path><path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path><path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path><path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path><path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path><path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path><path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path><path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="moon" data-v-82b282f1><path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-0937f67c data-v-0394ad82 data-v-7bc22406><!--[--><a class="VPSocialLink no-icon" href="https://github.com/renshuo123/renshuo123.github.io" aria-label="github" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a><a class="VPSocialLink no-icon" href="#" aria-label="twitter" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Twitter</title><path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/></svg></a><a class="VPSocialLink no-icon" href="https://github.com/" aria-label target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg t="1676028692954" class="icon" ...</path></svg></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-0937f67c data-v-40855f84 data-v-a7b5672a><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-a7b5672a><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="icon" data-v-a7b5672a><circle cx="12" cy="12" r="2"></circle><circle cx="19" cy="12" r="2"></circle><circle cx="5" cy="12" r="2"></circle></svg></button><div class="menu" data-v-a7b5672a><div class="VPMenu" data-v-a7b5672a data-v-e7ea1737><!----><!--[--><!--[--><!----><div class="group" data-v-40855f84><div class="item appearance" data-v-40855f84><p class="label" data-v-40855f84>Appearance</p><div class="appearance-action" data-v-40855f84><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title="toggle dark mode" aria-checked="false" data-v-40855f84 data-v-82b282f1 data-v-f3c41672><span class="check" data-v-f3c41672><span class="icon" data-v-f3c41672><!--[--><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="sun" data-v-82b282f1><path d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path><path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path><path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path><path d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path><path d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path><path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path><path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path><path d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path><path d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="moon" data-v-82b282f1><path d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg><!--]--></span></span></button></div></div></div><div class="group" data-v-40855f84><div class="item social-links" data-v-40855f84><div class="VPSocialLinks social-links-list" data-v-40855f84 data-v-7bc22406><!--[--><a class="VPSocialLink no-icon" href="https://github.com/renshuo123/renshuo123.github.io" aria-label="github" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>GitHub</title><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a><a class="VPSocialLink no-icon" href="#" aria-label="twitter" target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Twitter</title><path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/></svg></a><a class="VPSocialLink no-icon" href="https://github.com/" aria-label target="_blank" rel="noopener" data-v-7bc22406 data-v-f80f8133><svg t="1676028692954" class="icon" ...</path></svg></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-0937f67c data-v-e5dd9c1c><span class="container" data-v-e5dd9c1c><span class="top" data-v-e5dd9c1c></span><span class="middle" data-v-e5dd9c1c></span><span class="bottom" data-v-e5dd9c1c></span></span></button></div></div></div></div><!----></header><div class="VPLocalNav reached-top" data-v-255ec12d data-v-5cfd5582><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-5cfd5582><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="menu-icon" data-v-5cfd5582><path d="M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"></path><path d="M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"></path><path d="M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"></path><path d="M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"></path></svg><span class="menu-text" data-v-5cfd5582>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-5cfd5582 data-v-18201f51><button data-v-18201f51>Return to top</button><!----></div></div><aside class="VPSidebar" data-v-255ec12d data-v-845b8fc6><div class="curtain" data-v-845b8fc6></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-845b8fc6><span class="visually-hidden" id="sidebar-aria-label" data-v-845b8fc6> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Java</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E6%96%B0%E7%89%B9%E6%80%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java新特性</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E9%9B%86%E5%90%88.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java集合</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Java/Java%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Java高级</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Linux</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/Linux%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Linux基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/Linux%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Linux新特性</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/Shell.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Shell脚本</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/%E5%AE%9E%E7%94%A8%E8%84%9A%E6%9C%AC.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>实用脚本</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Linux/%E8%BD%AF%E4%BB%B6%E9%83%A8%E7%BD%B2.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>软件部署</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Nginx</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E5%AE%9E%E6%88%98%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>实战篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Nginx/%E9%9D%A2%E8%AF%95%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>面试篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SSM</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/Maven.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Maven</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/Spring.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Spring</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/SpringMVC.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringMVC</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/SSM/SpringBatch.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringBatch</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SpringBoot</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E5%BA%94%E7%94%A8%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>应用篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E6%96%B0%E7%89%B9%E6%80%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>新特性</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/3%E3%80%81SpringBoot/%E8%BF%90%E7%BB%B4&amp;%E5%8E%9F%E7%90%86.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>运维&原理</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SpringCloud</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringCloud</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E5%BF%85%E5%A4%87/Sentinel.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Sentinel</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>SpringSecurity</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/SpringSecurity/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringSecurity基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/SpringSecurity/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringSecurity进阶篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/SpringSecurity/%E9%AB%98%E7%BA%A7%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>SpringSecurity高级篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Mybatis & MybatisPlus</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Mybatis&amp;MybatisPlus/Mybatis.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Mybatis</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Mybatis&amp;MybatisPlus/MybatisPlus.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MybatisPlus</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/Mybatis&amp;MybatisPlus/JPA.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>JPA</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>Git & ChatGPT</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Git.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Git</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Github.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Github</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/ChatGPT.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ChatGPT</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Jenkins.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Jenkins</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/5%E3%80%81%E8%BF%90%E7%BB%B4/Netty.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Netty</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>数据库</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>MySQL</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E4%BC%98%E5%8C%96.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL优化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E8%AE%BE%E8%AE%A1.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL设计</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/MySQL%E6%A0%B8%E5%BF%83/%E8%BF%90%E7%BB%B4.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MySQL运维</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MySQL/%E5%88%86%E5%BA%93%E5%88%86%E8%A1%A8.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>分库分表</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>Redis</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E4%BC%98%E5%8C%96.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis优化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E5%8E%9F%E7%90%86.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis原理</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis高级</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/Redis%E5%AE%9E%E6%88%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Redis实战</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Redis/%E6%9C%AC%E5%9C%B0%E7%BC%93%E5%AD%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>本地缓存</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>MongoDB</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MongoDB/%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MongoDB基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/MongoDB/%E6%95%B4%E5%90%88.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>MongoDB进阶</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>ElasticSearch</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/ElasticSearch/1%E3%80%81ES%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/ElasticSearch/3%E3%80%81ES%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES高级</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/influxdb.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>InfluxDB</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/2%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93/Neo4j.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Neo4j</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>高并发 & 秒杀 & 分布式</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E5%88%86%E5%B8%83%E5%BC%8F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>分布式理论</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/4%E3%80%81%E5%BE%AE%E6%9C%8D%E5%8A%A1/%E5%BF%85%E5%A4%87/%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>分布式锁</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E7%A7%92%E6%9D%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>秒杀</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E9%AB%98%E5%8F%AF%E7%94%A8.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>高可用</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%B8%89%E9%AB%98/%E9%AB%98%E5%B9%B6%E5%8F%91.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>高并发</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>云原生</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%BA%91%E5%8E%9F%E7%94%9F/Docker.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Docker</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E4%BA%91%E5%8E%9F%E7%94%9F/K8S.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>K8S</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>可视化 & 监控</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/%E7%9B%91%E6%8E%A7%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>监控基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/%E7%9B%91%E6%8E%A7%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>监控进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/%E5%8F%AF%E8%A7%86%E5%8C%96%E5%A4%A7%E5%B1%8F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>可视化大屏</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E5%8F%AF%E8%A7%86%E5%8C%96%20&amp;%20%E7%9B%91%E6%8E%A7/Zabbix.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Zabbix</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>学前端</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>HTML+CSS</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/1%E3%80%81HTML+CSS/HTML%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>HTML基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/1%E3%80%81HTML+CSS/CSS%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>CSS基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/1%E3%80%81HTML+CSS/%E7%BD%91%E9%A1%B5%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>网页进阶</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>JS+TS</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/JS%20%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>JS基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/JS%20%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>JS进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/ES6%20%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES6基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/ES6%20%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>ES6进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/2%E3%80%81JS+TS/TypeScript.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>TS基础</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>NodeJS</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/4%E3%80%81Node/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Node基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/4%E3%80%81Node/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Node进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/4%E3%80%81Node/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目实战</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>Vue</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue3/Vue3%E8%BF%9B%E9%98%B6.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Vue3进阶</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue3/Vue3%E9%AB%98%E7%BA%A7.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Vue3高级</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue3/Vue3%E6%96%B0%E8%AF%AD%E6%B3%95.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>Vue3新语法</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/3%E3%80%81Vue/Vue2/Vue2%E9%A1%B9%E7%9B%AE.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目实战</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>小程序</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>小程序基础</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%BC%98%E5%8C%96.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>小程序优化</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/uniapp.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>uniapp</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/1%E3%80%81%E5%AD%A6%E5%89%8D%E7%AB%AF/5%E3%80%81%E5%B0%8F%E7%A8%8B%E5%BA%8F/%E5%B0%8F%E7%A8%8B%E5%BA%8F%E9%A1%B9%E7%9B%AE.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目实战</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>计算机基础</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>数据结构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>操作系统</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>设计模式</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>计算机网络</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/UML.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>UML</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/%E7%AE%97%E6%B3%95/LeetCode.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>LeetCode</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0 collapsible collapsed" data-v-845b8fc6 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h2 class="text" data-v-9b797284>项目实战</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>云尚办公</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E4%BA%91%E5%B0%9A%E5%8A%9E%E5%85%AC/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>小兔鲜</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%B0%8F%E5%85%94%E9%B2%9C/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%B0%8F%E5%85%94%E9%B2%9C/%E8%BF%9B%E9%98%B6%E7%AF%871.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇1</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E5%B0%8F%E5%85%94%E9%B2%9C/%E8%BF%9B%E9%98%B6%E7%AF%872.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇2</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>地图</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>苍穹外卖</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E8%8B%8D%E7%A9%B9%E5%A4%96%E5%8D%96/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 collapsible collapsed" data-v-9b797284 data-v-9b797284><div class="item" role="button" tabindex="0" data-v-9b797284><div class="indicator" data-v-9b797284></div><h3 class="text" data-v-9b797284>黑马头条</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-9b797284><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewbox="0 0 24 24" class="caret-icon" data-v-9b797284><path d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"></path></svg></div></div><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E5%9F%BA%E7%A1%80%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>基础篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E8%BF%9B%E9%98%B6%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E8%BF%9B%E9%98%B6%E7%AF%872.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>进阶篇2</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%BB%91%E9%A9%AC%E5%A4%B4%E6%9D%A1/%E9%AB%98%E7%BA%A7%E7%AF%87.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>高级篇</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E6%94%AF%E4%BB%98.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>支付</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/%E9%A1%B9%E7%9B%AE%E6%8E%A8%E8%8D%90.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>项目推荐</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="group" data-v-845b8fc6><section class="VPSidebarItem level-0" data-v-845b8fc6 data-v-9b797284><!----><div class="items" data-v-9b797284><!--[--><div class="VPSidebarItem level-1 is-link" data-v-9b797284 data-v-9b797284><div class="item" data-v-9b797284><div class="indicator" data-v-9b797284></div><a class="VPLink link link" href="/notebook/team.html" data-v-9b797284><!--[--><p class="text" data-v-9b797284>团队成员</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-255ec12d data-v-669faec9><div class="VPDoc has-sidebar has-aside" data-v-669faec9 data-v-6b87e69f><!--[--><!--]--><div class="container" data-v-6b87e69f><div class="aside" data-v-6b87e69f><div class="aside-curtain" data-v-6b87e69f></div><div class="aside-container" data-v-6b87e69f><div class="aside-content" data-v-6b87e69f><div class="VPDocAside" data-v-6b87e69f data-v-3f215769><!--[--><!--]--><!--[--><!--]--><div class="VPDocAsideOutline" data-v-3f215769 data-v-ff0f39c8><div class="content" data-v-ff0f39c8><div class="outline-marker" data-v-ff0f39c8></div><div class="outline-title" data-v-ff0f39c8>On this page</div><nav aria-labelledby="doc-outline-aria-label" data-v-ff0f39c8><span class="visually-hidden" id="doc-outline-aria-label" data-v-ff0f39c8> Table of Contents for current page </span><ul class="root" data-v-ff0f39c8 data-v-d0ee3533><!--[--><!--]--></ul></nav></div></div><!--[--><!--]--><div class="spacer" data-v-3f215769></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-6b87e69f><div class="content-container" data-v-6b87e69f><!--[--><!--]--><!----><main class="main" data-v-6b87e69f><div style="position:relative;" class="vp-doc _notebook_IDEA_IDEA%E5%9F%BA%E7%A1%80" data-v-6b87e69f><div><h1 id="idea-学习⭐⭐" tabindex="-1">IDEA 学习⭐⭐ <a class="header-anchor" href="#idea-学习⭐⭐" aria-label="Permalink to &quot;IDEA 学习⭐⭐&quot;">​</a></h1><h1 id="认识intellij-idea" tabindex="-1">认识IntelliJ IDEA <a class="header-anchor" href="#认识intellij-idea" aria-label="Permalink to &quot;认识IntelliJ IDEA&quot;">​</a></h1><h2 id="why-idea" tabindex="-1">Why IDEA ? <a class="header-anchor" href="#why-idea" aria-label="Permalink to &quot;Why IDEA ?&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230855592.png" alt="image-20221123085543513" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230855644.png" alt="image-20221123085557571" style="zoom:80%;"><blockquote><p>JetBrains官方说明：尽管我们采取了多种措施确保受访者的代表性，但结果可能会略微偏向 JetBrains 产品的用户，因为这些用户更有可能参加调查。此外，2022年，某美国软件开发商在对近千名专业的Java开发者调研后，发布了《2022年Java开发者生产力报告》。报告提到：JetBrains 的 IntelliJ IDEA是最受欢迎的 Java IDE，占 48% ，其次是 Eclipse，占24%，Visual Studio Code 占 18%。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.1.30/202301141029375.png" alt="image-20230114102914288" style="zoom:67%;"><h2 id="why-idea-2022-x" tabindex="-1">Why IDEA 2022.x <a class="header-anchor" href="#why-idea-2022-x" aria-label="Permalink to &quot;Why IDEA 2022.x&quot;">​</a></h2><p>在Java 17正式发布之前，Java开发框架Spring率先在官博宣布，Spring Framework 6和Spring Boot 3计划在2022年第四季度实现总体可用性的高端基线：</p><p>Java 17+(来自 Spring Framework 5.3.x 线中的 Java 8-17)</p><p>Jakarta EE 9+（来自Spring框架5.3.x 线中的 Java EE 7-8）</p><p>Spring 官方说明： <a href="https://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-now-available" target="_blank" rel="noreferrer">https://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-now-available</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230857424.png" alt="image-20221123085714337" style="zoom:80%;"><blockquote><p>意味着：springboot3.0 是需要用java17和spring6.0为基础建设。如果从企业选型最新springboot3.0作为架构来说，它搭配jdk17肯定是标配了。</p></blockquote><h2 id="jetbrains-公司介绍" tabindex="-1">JetBrains 公司介绍 <a class="header-anchor" href="#jetbrains-公司介绍" aria-label="Permalink to &quot;JetBrains 公司介绍&quot;">​</a></h2><p>IDEA，是 JetBrains ( <strong><a href="https://www.jetbrains.com/" target="_blank" rel="noreferrer">https://www.jetbrains.com/</a></strong>)公司的产品，该公司成立于2000年，总部位于捷克的布拉格，致力于为开发者打造最高效智能的开发工具。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230858883.png" alt="image-20221123085824817" style="zoom:80%;"><p>公司旗下还有其它产品，比如：</p><p>WebStorm：用于开发 JavaScript、HTML5、CSS3 等前端技术</p><p>PyCharm：用于开发 python</p><p>PhpStorm：用于开发 PHP</p><p>RubyMine：用于开发 Ruby/Rails</p><p>AppCode：用于开发 Objective - C/Swift</p><p>CLion：用于开发 C/C++</p><p>DataGrip：用于开发数据库和 SQL</p><p>Rider：用于开发.NET</p><p>GoLand：用于开发 Go</p><p>用于开发 Android的Android Studio，也是Google 基于 IDEA 社区版进行迭代的。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230859602.png" alt="image-20221123085910528" style="zoom:80%;"><h2 id="intellij-idea-介绍" tabindex="-1">IntelliJ IDEA 介绍 <a class="header-anchor" href="#intellij-idea-介绍" aria-label="Permalink to &quot;IntelliJ IDEA 介绍&quot;">​</a></h2><p>IDEA，全称 IntelliJ IDEA ，是 Java 语言的集成开发环境，目前已经（基本） 代替 了Eclipse的使用。IDEA 在业界被公认为是最好的 Java 开发工具（之一），因其 功能强悍 、 设置人性化 ，而深受Java、大数据、移动端程序员的喜爱。尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS 整合、代码审查、创新的 GUI 设计等方面的功能可以说是超常的。</p><p>IntelliJ IDEA 在 2015 年的官网上这样介绍自己：Excel at enterprise, mobile and web development with Java, Scala and Groovy,with all the latestmodern technologies and frameworks available out of thebox.</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230900171.png" alt="image-20221123090001093" style="zoom:80%;"><h2 id="idea的主要优势-vs-eclipse" tabindex="-1">IDEA的主要优势：(vs Eclipse) <a class="header-anchor" href="#idea的主要优势-vs-eclipse" aria-label="Permalink to &quot;IDEA的主要优势：(vs Eclipse)&quot;">​</a></h2><h3 id="功能强大" tabindex="-1">功能强大 <a class="header-anchor" href="#功能强大" aria-label="Permalink to &quot;功能强大&quot;">​</a></h3><p>① 强大的整合能力。比如：Git、Maven、Spring等</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230900135.png" alt="image-20221123090056068" style="zoom:80%;"><p>② 开箱即用的体验（集成版本控制系统、多语言支持的框架随时可用，无需额外安装插件）</p><p><strong>符合人体工程学</strong></p><p>① 高度智能（快速的智能代码补全、实时代码分析、可靠的重构工具）</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230902316.png" alt="image-20221123090229208" style="zoom:80%;"><p>② 提示功能的快速、便捷、范围广</p><p>③ 好用的快捷键和代码模板</p><p>④ 精准搜索</p><h2 id="idea-的下载" tabindex="-1">IDEA 的下载 <a class="header-anchor" href="#idea-的下载" aria-label="Permalink to &quot;IDEA 的下载&quot;">​</a></h2><p>下载网址： <a href="https://www.jetbrains.com/idea/download/#section=windows" target="_blank" rel="noreferrer">https://www.jetbrains.com/idea/download/#section=windows</a></p><p>IDEA 分为两个版本： 旗舰版(Ultimate) 和 社区版(Community) 。</p><p>IDEA的大版本每年迭代一次，大版本下的小版本（如：2022.x）迭代时间不固定，一般每年3个小版本</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230906919.png" alt="image-20221123090657836" style="zoom:80%;"><p>两个不同版本的详细对比</p><p>可以参照官网： <a href="https://www.jetbrains.com/idea/features/editions_comparison_matrix.html" target="_blank" rel="noreferrer">https://www.jetbrains.com/idea/features/editions_comparison_matrix.html</a></p><p>官网提供的详细使用文档： <strong><a href="https://www.jetbrains.com/help/idea/meet-intellij-idea.html" target="_blank" rel="noreferrer">https://www.jetbrains.com/help/idea/meet-intellij-idea.html</a></strong></p><h1 id="卸载与安装" tabindex="-1">卸载与安装 <a class="header-anchor" href="#卸载与安装" aria-label="Permalink to &quot;卸载与安装&quot;">​</a></h1><h2 id="卸载过程" tabindex="-1">卸载过程 <a class="header-anchor" href="#卸载过程" aria-label="Permalink to &quot;卸载过程&quot;">​</a></h2><p>这里以卸载2022.1.2版本为例说明。在【控制面板】找到【卸载程序】</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230908419.png" alt="image-20221123090815330" style="zoom:80%;"><p>右键点击或左键双击IntelliJ IDEA 2022.1.2进行卸载：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230908030.png" alt="image-20221123090833950" style="zoom:80%;"><p>如果需要保留下述数据，就不要打√。如果想彻底删除IDEA所有数据，那就打上√。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230908246.png" alt="image-20221123090855172" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230909618.png" alt="image-20221123090906549" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230909133.png" alt="image-20221123090923062" style="zoom:80%;"><h2 id="清理残留" tabindex="-1">清理残留 <a class="header-anchor" href="#清理残留" aria-label="Permalink to &quot;清理残留&quot;">​</a></h2><p>软件卸载完以后，还需要删除其它几个位置的残留</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230910171.png" alt="image-20221123091029099" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230910862.png" alt="image-20221123091044780" style="zoom:80%;"><h2 id="安装前的准备" tabindex="-1">安装前的准备 <a class="header-anchor" href="#安装前的准备" aria-label="Permalink to &quot;安装前的准备&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230911870.png" alt="image-20221123091115797" style="zoom:80%;"><ul><li>64 位 Microsoft Windows 11、10、8</li><li>最低 2 GB 可用 RAM，推荐 8 GB 系统总 RAM</li><li>2.5 GB 硬盘空间，推荐 SSD</li><li>最低屏幕分辨率 1024x768</li></ul><p>从安装上来看，IntelliJ IDEA 对硬件的要求 似乎不是很高 。可是在实际开发中并不是这样的，因为 IntelliJ IDEA 执行时会有大量的缓存、索引文件，所以如果你正在使用 Eclipse / MyEclipse，想通过 IntelliJ IDEA来解决计算机的卡、慢等问题，这基本上是不可能的，本质上你应该对自己的硬件设备进行升级。</p><h2 id="安装过程" tabindex="-1">安装过程 <a class="header-anchor" href="#安装过程" aria-label="Permalink to &quot;安装过程&quot;">​</a></h2><p>1、下载完安装包，双击直接安装</p><p>2、欢迎安装</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230912573.png" alt="image-20221123091209475" style="zoom:67%;"><p>3、是否删除电脑上低版本的IDEA（如果有，可以选择忽略）</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230912395.png" alt="image-20221123091227293" style="zoom:67%;"><p>如果电脑上有低版本的IDEA，可以选择删除或保留。</p><p>这里没有卸载旧版本，如果需要卸载，记得勾选下面的保留旧的设置和配置。</p><p>4、选择安装目录</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230912406.png" alt="image-20221123091248316" style="zoom:80%;"><p>选择安装目录，目录中要避免中文和空格。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230913883.png" alt="image-20221123091309790" style="zoom:67%;"><p>5、创建桌面快捷图标等</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230913580.png" alt="image-20221123091331492" style="zoom:67%;"><p>确认是否与.java、.groovy、.kt 格式文件进行关联。这里建议不关联。</p><p>6、在【开始】菜单新建一个文件夹（这里需要确认文件夹的名称），来管理IDEA的相关内容。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230913479.png" alt="image-20221123091355391" style="zoom:67%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230914727.png" alt="image-20221123091407638" style="zoom:80%;"><p>7、完成安装</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230914140.png" alt="image-20221123091426037" style="zoom:80%;"><h2 id="注册破解" tabindex="-1">注册破解 <a class="header-anchor" href="#注册破解" aria-label="Permalink to &quot;注册破解&quot;">​</a></h2><h2 id="闪退-无响应-问题⭐" tabindex="-1">闪退 | 无响应 问题⭐ <a class="header-anchor" href="#闪退-无响应-问题⭐" aria-label="Permalink to &quot;闪退 | 无响应 问题⭐&quot;">​</a></h2><p>问题描述1：2022.1启动不了，双击桌面图标，没有响应。</p><p>问题描述2：进入到安装目录...\IntelliJ IDEA 2022.1.2\bin，打开CMD。输入idea，发现报错。</p><p>解决办法：打开C:\Users\songhk\AppData\Roaming\JetBrains\IntelliJIdea2022.1\idea64.exe.vmoptions</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230915993.png" alt="image-20221123091558919" style="zoom:80%;"><p>内容如下所示：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230916699.png" alt="image-20221123091611636" style="zoom:80%;"><p>删除红框的数据以后，再登录即可正常进入。</p><blockquote><p>原因：之前使用过的比如2021.2.2版本，pojie了。新版IEDA太智能了，把现有的启运参数也都复制过去</p><p>了。又因为最新的IDEA，不兼容pojie程序-javaagent:D:\develop_tools\IDEA\IntelliJ IDEA</p><p>2021.2.2\bin\jetbrains-agent.jar了，所以报错了，所以JVM结束了，所以没有启动画面，凉凉了。</p></blockquote><h2 id="idea卡顿问题⭐" tabindex="-1">IDEA卡顿问题⭐ <a class="header-anchor" href="#idea卡顿问题⭐" aria-label="Permalink to &quot;IDEA卡顿问题⭐&quot;">​</a></h2><p>解决方案： 找到idea安装目录下的bin文件夹下的idea.exe.vmoptions文件！</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230954375.png" alt="image-20221123095432306" style="zoom:80%;"><p>idea.exe.vmoptions：默认32位机器运行的 idea64.exe.vmoptions：默认64位机器运行的</p><p>手动修改：关键的三个参数的说明</p><p>1、 -Xms 是最小启动内存参数 2、 -Xmx 是最大运行内存参数 3、 -XX:ReservedCodeCacheSize 保留代码占用的内存容量参数</p><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">-Xms2048m</span></span>
<span class="line"><span style="color:#FFCB6B;">-Xmx4096m</span></span>
<span class="line"><span style="color:#FFCB6B;">-XX:ReservedCodeCacheSize</span><span style="color:#A6ACCD;">=1024m</span></span></code></pre></div><h1 id="helloworld的实现" tabindex="-1">HelloWorld的实现 <a class="header-anchor" href="#helloworld的实现" aria-label="Permalink to &quot;HelloWorld的实现&quot;">​</a></h1><h2 id="_1-新建project-class" tabindex="-1">1 新建Project - Class <a class="header-anchor" href="#_1-新建project-class" aria-label="Permalink to &quot;1 新建Project - Class&quot;">​</a></h2><p>选择&quot;New Project&quot;：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230917859.png" alt="image-20221123091725778" style="zoom:67%;"><p>指名工程名、使用的JDK版本等信息。如下所示：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230918622.png" alt="image-20221123091845541" style="zoom:80%;"><p>接着创建Java类：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230919172.png" alt="image-20221123091905102" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230919682.png" alt="image-20221123091918613" style="zoom:80%;"><h2 id="_2-编写代码" tabindex="-1">2 编写代码 <a class="header-anchor" href="#_2-编写代码" aria-label="Permalink to &quot;2 编写代码&quot;">​</a></h2><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">class</span><span style="color:#A6ACCD;"> </span><span style="color:#FFCB6B;">HelloWorld</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">static</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">void</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">main</span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">String</span><span style="color:#89DDFF;">[]</span><span style="color:#A6ACCD;"> </span><span style="color:#A6ACCD;font-style:italic;">args</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">        System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">Hello World</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">}</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><h2 id="_3-运行" tabindex="-1">3 运行 <a class="header-anchor" href="#_3-运行" aria-label="Permalink to &quot;3 运行&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230921986.png" alt="image-20221123092115915" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230921720.png" alt="image-20221123092125646" style="zoom:80%;"><h1 id="jdk相关设置" tabindex="-1">JDK相关设置 <a class="header-anchor" href="#jdk相关设置" aria-label="Permalink to &quot;JDK相关设置&quot;">​</a></h1><h2 id="_1-项目的jdk设置" tabindex="-1">1 项目的JDK设置 <a class="header-anchor" href="#_1-项目的jdk设置" aria-label="Permalink to &quot;1 项目的JDK设置&quot;">​</a></h2><blockquote><p>File--&gt;Project Structure...--&gt;Platform Settings --&gt;SDKs</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230922984.png" alt="image-20221123092258900" style="zoom:67%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231558811.png" alt="image-20221123155843715" style="zoom:80%;"><blockquote><p>注1：SDKs全称是Software Development Kit ，这里一定是选择JDK的安装根目录，不是JRE的目录。</p><p>注2：这里还可以从本地添加多个JDK。使用“+”即可实现。</p></blockquote><h2 id="_2-out目录和编译版本" tabindex="-1">2 out目录和编译版本 <a class="header-anchor" href="#_2-out目录和编译版本" aria-label="Permalink to &quot;2 out目录和编译版本&quot;">​</a></h2><blockquote><p>File--&gt;Project Structure...--&gt;Project Settings --&gt;Project</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230925391.png" alt="image-20221123092501307" style="zoom:80%;"><h1 id="idea详细设置⭐" tabindex="-1">IDEA详细设置⭐ <a class="header-anchor" href="#idea详细设置⭐" aria-label="Permalink to &quot;IDEA详细设置⭐&quot;">​</a></h1><h2 id="_1-如何打开详细配置界面" tabindex="-1">1 如何打开详细配置界面 <a class="header-anchor" href="#_1-如何打开详细配置界面" aria-label="Permalink to &quot;1 如何打开详细配置界面&quot;">​</a></h2><h3 id="_1、显示工具栏" tabindex="-1">1、显示工具栏 <a class="header-anchor" href="#_1、显示工具栏" aria-label="Permalink to &quot;1、显示工具栏&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230928245.png" alt="image-20221123092819145" style="zoom:80%;"><h3 id="_2、选择详细配置菜单或按钮" tabindex="-1">2、选择详细配置菜单或按钮 <a class="header-anchor" href="#_2、选择详细配置菜单或按钮" aria-label="Permalink to &quot;2、选择详细配置菜单或按钮&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230928709.png" alt="image-20221123092837616" style="zoom:67%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230928119.png" alt="image-20221123092849047" style="zoom:80%;"><h2 id="_2-系统设置" tabindex="-1">2 系统设置 <a class="header-anchor" href="#_2-系统设置" aria-label="Permalink to &quot;2 系统设置&quot;">​</a></h2><h3 id="_1、默认启动项目配置" tabindex="-1">1、默认启动项目配置 <a class="header-anchor" href="#_1、默认启动项目配置" aria-label="Permalink to &quot;1、默认启动项目配置&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230929962.png" alt="image-20221123092925878" style="zoom:80%;"><p>启动IDEA时，默认自动打开上次开发的项目？还是自己选择？</p><p>如果去掉Reopen last project on startup前面的对勾，每次启动IDEA就会出现如下界面：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230929013.png" alt="image-20221123092957935" style="zoom:80%;"><h3 id="_2、取消自动更新" tabindex="-1">2、取消自动更新 <a class="header-anchor" href="#_2、取消自动更新" aria-label="Permalink to &quot;2、取消自动更新&quot;">​</a></h3><blockquote><p>Settings--&gt;Appearance &amp; Behavior-&gt;System Settings -&gt; Updates</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230930623.png" alt="image-20221123093040540" style="zoom:80%;"><p>默认都打√了，建议检查IDE更新的√去掉，检查插件更新的√选上。</p><h2 id="_3-主题、字体、背景图" tabindex="-1">3 主题、字体、背景图 <a class="header-anchor" href="#_3-主题、字体、背景图" aria-label="Permalink to &quot;3 主题、字体、背景图&quot;">​</a></h2><h3 id="_1、选择主题" tabindex="-1">1、选择主题 <a class="header-anchor" href="#_1、选择主题" aria-label="Permalink to &quot;1、选择主题&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230931140.png" alt="image-20221123093123075" style="zoom:80%;"><h3 id="_2、设置菜单和窗口字体和大小" tabindex="-1">2、设置菜单和窗口字体和大小 <a class="header-anchor" href="#_2、设置菜单和窗口字体和大小" aria-label="Permalink to &quot;2、设置菜单和窗口字体和大小&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230931229.png" alt="image-20221123093152156" style="zoom:80%;"><h3 id="_3、设置idea背景图" tabindex="-1">3、设置IDEA背景图 <a class="header-anchor" href="#_3、设置idea背景图" aria-label="Permalink to &quot;3、设置IDEA背景图&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230933541.png" alt="image-20221123093335461" style="zoom:80%;"><p>选择一张合适的图片作为背景，即可。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230934154.png" alt="image-20221123093438070" style="zoom:80%;"><h2 id="_4-设置编辑器主题样式" tabindex="-1">4 设置编辑器主题样式 <a class="header-anchor" href="#_4-设置编辑器主题样式" aria-label="Permalink to &quot;4 设置编辑器主题样式&quot;">​</a></h2><h3 id="_1、编辑器主题" tabindex="-1">1、编辑器主题 <a class="header-anchor" href="#_1、编辑器主题" aria-label="Permalink to &quot;1、编辑器主题&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230935198.png" alt="image-20221123093522133" style="zoom:80%;"><h3 id="_2、字体大小" tabindex="-1">2、字体大小 <a class="header-anchor" href="#_2、字体大小" aria-label="Permalink to &quot;2、字体大小&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230935717.png" alt="image-20221123093547632" style="zoom:80%;"><p>更详细的字体与颜色如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230936841.png" alt="image-20221123093611752" style="zoom:80%;"><blockquote><p>温馨提示：如果选择某个font字体，中文乱码，可以在fallback font（备选字体）中选择一个支持中文的字体。</p></blockquote><h3 id="_3、注释的字体颜色" tabindex="-1">3、注释的字体颜色 <a class="header-anchor" href="#_3、注释的字体颜色" aria-label="Permalink to &quot;3、注释的字体颜色&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230937455.png" alt="image-20221123093706362" style="zoom:80%;"><blockquote><p>Block comment：修改多行注释的字体颜色</p><p>Doc Comment –&gt; Text：修改文档注释的字体颜色</p><p>Line comment：修改单行注释的字体颜色</p></blockquote><h3 id="_4、显示行号与方法分隔符" tabindex="-1">4、显示行号与方法分隔符 <a class="header-anchor" href="#_4、显示行号与方法分隔符" aria-label="Permalink to &quot;4、显示行号与方法分隔符&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230937559.png" alt="image-20221123093755484" style="zoom:80%;"><h2 id="_5-代码提示取消大小写匹配" tabindex="-1">5 代码提示取消大小写匹配 <a class="header-anchor" href="#_5-代码提示取消大小写匹配" aria-label="Permalink to &quot;5 代码提示取消大小写匹配&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230939037.png" alt="image-20221123093928956" style="zoom:80%;"><p>IntelliJ IDEA 的代码提示和补充功能有一个特性： 区分大小写 。 如果想不区分大小写的话，就把这个对勾去掉。 建议去掉勾选 。</p><h2 id="_6-自动导包、自动移除没用的包" tabindex="-1">6 自动导包、自动移除没用的包 <a class="header-anchor" href="#_6-自动导包、自动移除没用的包" aria-label="Permalink to &quot;6 自动导包、自动移除没用的包&quot;">​</a></h2><h3 id="_1-手动导包" tabindex="-1">1 手动导包 <a class="header-anchor" href="#_1-手动导包" aria-label="Permalink to &quot;1 手动导包&quot;">​</a></h3><p>默认需要自己手动导包，Alt+Enter快捷键</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230941038.png" alt="image-20221123094100950" style="zoom:67%;"><h3 id="_2-自动导包设置" tabindex="-1">2 自动导包设置 <a class="header-anchor" href="#_2-自动导包设置" aria-label="Permalink to &quot;2 自动导包设置&quot;">​</a></h3><p>动态导入明确的包：Add unambiguous imports on the fly，该设置具有全局性；</p><p>优化动态导入的包：Optimize imports on the fly，该设置只对当前项目有效；</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211281506513.png" alt="image-20221128150645418" style="zoom:80%;"><h2 id="_7-设置项目文件编码-一定要改" tabindex="-1">7 设置项目文件编码（一定要改） <a class="header-anchor" href="#_7-设置项目文件编码-一定要改" aria-label="Permalink to &quot;7 设置项目文件编码（一定要改）&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230955102.png" alt="image-20221123095538000" style="zoom:67%;"><p>说明： Transparent native-to-ascii conversion主要用于转换ascii，显式原生内容。一般都要勾选。</p><h2 id="_8-设置控制台的字符编码" tabindex="-1">8 设置控制台的字符编码 <a class="header-anchor" href="#_8-设置控制台的字符编码" aria-label="Permalink to &quot;8 设置控制台的字符编码&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230956683.png" alt="image-20221123095648595" style="zoom:80%;"><h2 id="_9-创建文件时自动生成作者和时间信息" tabindex="-1">9 创建文件时自动生成作者和时间信息 <a class="header-anchor" href="#_9-创建文件时自动生成作者和时间信息" aria-label="Permalink to &quot;9 创建文件时自动生成作者和时间信息&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230957293.png" alt="image-20221123095711211" style="zoom:80%;"><p>比如：</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#676E95;font-style:italic;">/**</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">* ClassName: ${NAME}</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">* Package: ${PACKAGE_NAME}</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">* Description:</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">* @Author 任硕</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">* @Create ${DATE} ${TIME}</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">* @Version 1.0</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">*/</span></span></code></pre></div><p>后面新创建的Java类，就会出现这样的类头</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231620667.png" alt="image-20221123162048580" style="zoom:67%;"><p>常用的预设的变量，这里直接贴出官网给的：</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">{</span><span style="color:#A6ACCD;">PACKAGE_NAME</span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> - the name of the target package where the new </span><span style="color:#C792EA;">class</span><span style="color:#A6ACCD;"> </span><span style="color:#FFCB6B;">or</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">interface</span><span style="color:#A6ACCD;"> </span><span style="color:#FFCB6B;">will</span></span>
<span class="line"><span style="color:#A6ACCD;">be created.</span></span>
<span class="line"><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">{</span><span style="color:#A6ACCD;">PROJECT_NAME</span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;"> the name of the current project</span><span style="color:#89DDFF;">.</span></span>
<span class="line"><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">{</span><span style="color:#A6ACCD;">FILE_NAME</span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;"> the name of the </span><span style="color:#C792EA;">PHP</span><span style="color:#A6ACCD;"> file that will be created</span><span style="color:#89DDFF;">.</span></span>
<span class="line"><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">{</span><span style="color:#A6ACCD;">NAME</span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;"> the name of the </span><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> file which you specify in the </span><span style="color:#C792EA;">New</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">File</span><span style="color:#A6ACCD;"> dialog box during</span></span>
<span class="line"><span style="color:#A6ACCD;">the file creation</span><span style="color:#89DDFF;">.</span></span>
<span class="line"><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">{</span><span style="color:#A6ACCD;">USER</span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;"> the login name of the current user</span><span style="color:#89DDFF;">.</span></span>
<span class="line"><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">{</span><span style="color:#A6ACCD;">DATE</span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;"> the current system date</span><span style="color:#89DDFF;">.</span></span>
<span class="line"><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">{</span><span style="color:#A6ACCD;">TIME</span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;"> the current system time</span><span style="color:#89DDFF;">.</span></span>
<span class="line"><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">{</span><span style="color:#A6ACCD;">YEAR</span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;"> the current year</span><span style="color:#89DDFF;">.</span></span>
<span class="line"><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">{</span><span style="color:#A6ACCD;">MONTH</span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;"> the current month</span><span style="color:#89DDFF;">.</span></span>
<span class="line"><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">{</span><span style="color:#A6ACCD;">DAY</span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;"> the current day of the month</span><span style="color:#89DDFF;">.</span></span>
<span class="line"><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">{</span><span style="color:#A6ACCD;">HOUR</span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;"> the current hour</span><span style="color:#89DDFF;">.</span></span>
<span class="line"><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">{</span><span style="color:#A6ACCD;">MINUTE</span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;"> the current minute</span><span style="color:#89DDFF;">.</span></span>
<span class="line"><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">{</span><span style="color:#A6ACCD;">PRODUCT_NAME</span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;"> the name of the </span><span style="color:#C792EA;">IDE</span><span style="color:#A6ACCD;"> in which the file will be created</span><span style="color:#89DDFF;">.</span></span>
<span class="line"><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">{</span><span style="color:#A6ACCD;">MONTH_NAME_SHORT</span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;"> the first </span><span style="color:#F78C6C;">3</span><span style="color:#A6ACCD;"> letters of the month name</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;"> Example</span><span style="color:#89DDFF;font-style:italic;">:</span><span style="color:#A6ACCD;"> Jan</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> Feb</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> etc</span><span style="color:#89DDFF;">.</span></span>
<span class="line"><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">{</span><span style="color:#A6ACCD;">MONTH_NAME_FULL</span><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;"> full name of a month</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;"> Example</span><span style="color:#89DDFF;font-style:italic;">:</span><span style="color:#A6ACCD;"> January</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> February</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> etc</span><span style="color:#89DDFF;">.</span></span></code></pre></div><h2 id="_10-设置自动编译" tabindex="-1">10 设置自动编译 <a class="header-anchor" href="#_10-设置自动编译" aria-label="Permalink to &quot;10 设置自动编译&quot;">​</a></h2><blockquote><p>可以提高运行速度：Settings--&gt;Build,Execution,Deployment--&gt;Compiler</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211230959776.png" alt="image-20221123095941679" style="zoom:80%;"><h2 id="_11-设置为省电模式-可忽略" tabindex="-1">11 设置为省电模式(可忽略) <a class="header-anchor" href="#_11-设置为省电模式-可忽略" aria-label="Permalink to &quot;11 设置为省电模式(可忽略)&quot;">​</a></h2><blockquote><p>IntelliJ IDEA 有一种叫做 省电模式 的状态，开启这种模式之后 IntelliJ IDEA 会 关掉代码检查 和 代码提示 等功能。所以一般也可认为这是一种 阅读模式 ，如果你在开发过程中遇到突然代码文件不能进行检查和提示，可以来看看这里是否有开启该功能。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231000814.png" alt="image-20221123100025720" style="zoom:80%;"><h2 id="_12-取消双击shift搜索" tabindex="-1">12 取消双击shift搜索 <a class="header-anchor" href="#_12-取消双击shift搜索" aria-label="Permalink to &quot;12 取消双击shift搜索&quot;">​</a></h2><p>因为我们按shift切换中英文输入方式，经常被按到，总是弹出搜索框，太麻烦了。可以取消它。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231002918.png" alt="image-20221123100253831" style="zoom:80%;"><p>方式1：适用于IDEA 2022.1.2版本</p><p>在2022.1版本中，采用如下方式消双击shift出现搜索框：搜索double即可，勾选Disable double modifier</p><p>key shortcuts，禁用这个选项。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231003808.png" alt="image-20221123100312737" style="zoom:80%;"><p>方式2：适用于IDEA 2022.1.2之前版本</p><p>双击shift 或 ctrl + shift + a，打开如下搜索窗口：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231003061.png" alt="image-20221123100330985" style="zoom:80%;"><p>选择registry...，找到&quot;ide.suppress.double.click.handler&quot;，把复选框打上勾就可以取消双击shift出现搜索框了。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231003419.png" alt="image-20221123100352323" style="zoom:80%;"><h2 id="_13-取消tab页单行显示" tabindex="-1">13 取消tab页单行显示 <a class="header-anchor" href="#_13-取消tab页单行显示" aria-label="Permalink to &quot;13 取消tab页单行显示&quot;">​</a></h2><p>是否在单行显式编辑器选项卡（建议去掉勾选）</p><p>tab过多会自动关闭：<code>settings</code> - <code>editor</code> - <code>General</code> - <code>Editor tabs</code> - <code>tab limit</code> 数值设大就好了</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211281508306.png" alt="image-20221128150851224" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211281509249.png" alt="image-20221128150910173" style="zoom:80%;"><h2 id="_14-设置import显示-的个数" tabindex="-1">14 设置import显示 * 的个数 <a class="header-anchor" href="#_14-设置import显示-的个数" aria-label="Permalink to &quot;14 设置import显示 * 的个数&quot;">​</a></h2><p>设置代码样式：比如，设置import显示&quot;*&quot;时的个数</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231004183.png" alt="image-20221123100454108" style="zoom:80%;"><blockquote><p>总结：以上这些设置看似只是针对当前Project设置的，但是新建的其它Project也是同样适用的。</p></blockquote><h2 id="_15-双斜杠注释改成紧跟代码头" tabindex="-1">15 双斜杠注释改成紧跟代码头 <a class="header-anchor" href="#_15-双斜杠注释改成紧跟代码头" aria-label="Permalink to &quot;15 双斜杠注释改成紧跟代码头&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211281514287.png" alt="image-20221128151419178" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211281514118.png" alt="image-20221128151438031" style="zoom:80%;"><h2 id="_16-优化版本控制的目录颜色展示" tabindex="-1">16 优化版本控制的目录颜色展示 <a class="header-anchor" href="#_16-优化版本控制的目录颜色展示" aria-label="Permalink to &quot;16 优化版本控制的目录颜色展示&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211281516012.png" alt="image-20221128151627926" style="zoom:80%;"><h2 id="_17-显示行号和方法分割线" tabindex="-1">17 显示行号和方法分割线 <a class="header-anchor" href="#_17-显示行号和方法分割线" aria-label="Permalink to &quot;17 显示行号和方法分割线&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211281521522.png" alt="image-20221128152159436" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211281522628.png" alt="image-20221128152235540" style="zoom:80%;"><h2 id="_18-选中复制整行" tabindex="-1">18 选中复制整行 <a class="header-anchor" href="#_18-选中复制整行" aria-label="Permalink to &quot;18 选中复制整行&quot;">​</a></h2><blockquote><p>原本只会复制你选中的代码，改完配置后，就能复制整行，无论你是否完全选中</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212121224424.png" alt="image-20221212122434320" style="zoom:67%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212121224905.png" alt="image-20221212122456819" style="zoom:67%;"><h2 id="_19-关闭代码检查" tabindex="-1">19 关闭代码检查 <a class="header-anchor" href="#_19-关闭代码检查" aria-label="Permalink to &quot;19 关闭代码检查&quot;">​</a></h2><blockquote><p>与eclipse类似，idea也可以自己关闭代码检查 减少资源使用，但不推荐全部关闭，（是大佬当我没说），把我们项目中不会使用到的关闭就好了</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212121436213.png" alt="image-20221212143614130" style="zoom:80%;"><h2 id="_20-隐藏文件" tabindex="-1">20 隐藏文件 <a class="header-anchor" href="#_20-隐藏文件" aria-label="Permalink to &quot;20 隐藏文件&quot;">​</a></h2><blockquote><ol><li>【Files】→【Settings】</li><li>【Editor】→【File Types】→【Ignored Files and Folders】</li><li>输入要隐藏的名称，支持*号通配符</li><li>回车确认添加</li></ol></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212140953499.png" alt="image-20221214095307419" style="zoom:80%;"><h2 id="显示usages提示" tabindex="-1">显示usages提示 <a class="header-anchor" href="#显示usages提示" aria-label="Permalink to &quot;显示usages提示&quot;">​</a></h2><p>作用：版本高的idea有时变量方法会有usages提示，它会提示此方法、变量在哪里被使用了，如下图</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304101411510.png" alt="image-20230410141112440" style="zoom:80%;"><p>开启\关闭：Setting-&gt;Editor-&gt;Inlay Hints-&gt;Code vision-&gt;Usages，选择方框可选择开启或关闭</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304101411710.png" alt="image-20230410141125624" style="zoom:67%;"><h2 id="日志文件彩色显示" tabindex="-1">日志文件彩色显示 <a class="header-anchor" href="#日志文件彩色显示" aria-label="Permalink to &quot;日志文件彩色显示&quot;">​</a></h2><blockquote><p>依赖插件：ideolog，是默认安装的，无需自己安装</p></blockquote><blockquote><p>进入任一日志文件，点击显示上下文操作，点击日志，配置正则，即可正常显示</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202306151034639.png" alt="image-20230615103406562" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202306151046423.png" alt="image-20230615104636334" style="zoom:80%;"><h1 id="强大功能" tabindex="-1">强大功能 <a class="header-anchor" href="#强大功能" aria-label="Permalink to &quot;强大功能&quot;">​</a></h1><h2 id="注释更改⭐" tabindex="-1">注释更改⭐ <a class="header-anchor" href="#注释更改⭐" aria-label="Permalink to &quot;注释更改⭐&quot;">​</a></h2><blockquote><p>使用ctrl + r，进行替换</p></blockquote><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">/\*\*\s*\*\s*(.*?)\s*\*/</span></span>
<span class="line"><span style="color:#A6ACCD;">//$1\n</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.6.17/image-20230627102430580.png" alt="image-20230627102430580" style="zoom:80%;"><h1 id="配置导入与导出" tabindex="-1">配置导入与导出 <a class="header-anchor" href="#配置导入与导出" aria-label="Permalink to &quot;配置导入与导出&quot;">​</a></h1><p><a href="http://www.taodudu.cc/news/show-1749553.html" target="_blank" rel="noreferrer">http://www.taodudu.cc/news/show-1749553.html</a></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202305051455017.png" alt="image-20230505145555919" style="zoom:80%;"><h1 id="强大功能-1" tabindex="-1">强大功能 <a class="header-anchor" href="#强大功能-1" aria-label="Permalink to &quot;强大功能&quot;">​</a></h1><h2 id="_1-查看代码历史版本" tabindex="-1">1.查看代码历史版本 <a class="header-anchor" href="#_1-查看代码历史版本" aria-label="Permalink to &quot;1.查看代码历史版本&quot;">​</a></h2><blockquote><p>鼠标在需要查看的java类 右键 找到<code>Local History</code> &gt;&gt; <code>Show History</code> 点开即可看到历史版本，常用于自己忘记代码改了哪些内容 或需要恢复至某个版本 (注意 只能看近期修改 太久了也是看不到的)</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212121426385.png" alt="image-20221212142642267" style="zoom:67%;"><h2 id="_2-调整idea的虚拟内存" tabindex="-1">2. 调整idea的虚拟内存 <a class="header-anchor" href="#_2-调整idea的虚拟内存" aria-label="Permalink to &quot;2. 调整idea的虚拟内存&quot;">​</a></h2><p>尽管本质都是去改变 .vmoptions配置文件，但推荐使用<code>Change Memory Settings</code>去调整，选择<code>Edit Custom VM Options</code> 或者在本地磁盘目录更改，通过某些方法破解的idea 很可能造成idea打不开的情况</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212121430676.png" alt="image-20221212143033583" style="zoom:67%;"><h2 id="_3-微服务中将不同项目添加到同窗口" tabindex="-1">3 微服务中将不同项目添加到同窗口 <a class="header-anchor" href="#_3-微服务中将不同项目添加到同窗口" aria-label="Permalink to &quot;3 微服务中将不同项目添加到同窗口&quot;">​</a></h2><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuf7Trj846CBqvOYJ092l1CWWN4Oyq54X5MOxbsR2F85OvzeGicR0ERzZCDbzK49gsTn83WRcAKiaDzw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>步骤：<code>View</code> ——&gt;<code>Tool Windows</code> ——&gt; <code>services</code> ——&gt;<code>add services</code></p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuf7Trj846CBqvOYJ092l1CW3hl9l0IVwBrk7hZv22vN2icBGnXWY83gaspAJ5n1xzooVXgKErEPcrQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h3 id="_8-idea同个项目不同端口多开" tabindex="-1">8. idea同个项目不同端口多开 <a class="header-anchor" href="#_8-idea同个项目不同端口多开" aria-label="Permalink to &quot;8. idea同个项目不同端口多开&quot;">​</a></h3><blockquote><p>这是个非常实用的功能，可以模拟集群 测试负载均衡。此外 在开发阶段也是非常好用，开发过程中，让别人直接连自己本地测试 是不是非常方便？那自己又想打断点调试 会影响别人 怎么办呢 ？这个时候多开的作用就体现出来了！</p></blockquote><blockquote><p>网上很多方法提到勾选 <code>Allow parallel run</code> (不同版本idea 名称不一样) ， 但我本地启动发现每次都会同时同端口启动多个，不知道是版本问题还是操作问题，这里我用的是另一种有效的方法：</p></blockquote><p>在 <code>VM options</code> 加上-Dserver.port=8993</p><p>8993是区别于 application.yml 配置中 port 的另一个端口 ， 达到不同端口多开的效果</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212121510110.png" alt="image-20221212151011001" style="zoom:80%;"><h1 id="工程与模块管理" tabindex="-1">工程与模块管理 <a class="header-anchor" href="#工程与模块管理" aria-label="Permalink to &quot;工程与模块管理&quot;">​</a></h1><h2 id="idea项目结构" tabindex="-1">IDEA项目结构 <a class="header-anchor" href="#idea项目结构" aria-label="Permalink to &quot;IDEA项目结构&quot;">​</a></h2><h3 id="层级关系" tabindex="-1">层级关系 <a class="header-anchor" href="#层级关系" aria-label="Permalink to &quot;层级关系&quot;">​</a></h3><blockquote><p>project(工程) - module(模块) - package(包) - class(类)</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.1.30/202301141033660.png" style="zoom:60%;"><h3 id="项目结构" tabindex="-1">项目结构 <a class="header-anchor" href="#项目结构" aria-label="Permalink to &quot;项目结构&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.1.30/202301141031015.png" alt="image-20230114103138947" style="zoom:67%;"><h3 id="使用步骤" tabindex="-1">使用步骤 <a class="header-anchor" href="#使用步骤" aria-label="Permalink to &quot;使用步骤&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.1.30/202301141033893.png" alt="image-20230114103305797" style="zoom:67%;"><h2 id="project和module的概念" tabindex="-1">Project和Module的概念 <a class="header-anchor" href="#project和module的概念" aria-label="Permalink to &quot;Project和Module的概念&quot;">​</a></h2><p>这些结构的划分，是为了方便管理功能代码。在 IntelliJ IDEA 中，提出了Project和Module这两个概念。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231007374.png" alt="image-20221123100719287" style="zoom:80%;"><blockquote><p>在 IntelliJ IDEA 中Project是 最顶级的结构单元 ，然后就是Module。目前，主流的大型项目结构基本都是多Module的结构，这类项目一般是 按功能划分 的，比如：user-core-module、user-facade-module和user-hessian-module等等，模块之间彼此可以 相互依赖 ，有着不可分割的业务关系。因此，对于一个Project来说：</p></blockquote><blockquote><p>当为单Module项目的时候，这个单独的Module实际上就是一个Project。</p><p>当为多Module项目的时候，多个模块处于同一个Project之中，此时彼此之间具有 互相依赖 的关联关系。</p><p>当然多个模块没有建立依赖关系的话，也可以作为单独一个“小项目”运行。</p></blockquote><h2 id="创建module" tabindex="-1">创建Module <a class="header-anchor" href="#创建module" aria-label="Permalink to &quot;创建Module&quot;">​</a></h2><p>建议创建“Empty空工程”，然后创建多模块，每一个模块可以独立运行，相当于一个小项目。JavaSE阶段不涉及到模块之间的依赖。后期再学习模块之间的依赖。</p><p>（1）选择创建模块</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231010809.png" alt="image-20221123101038714" style="zoom:80%;"><p>（2）选择模块类型：这里选择创建Java模块，给模块命名，确定存放位置</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231010800.png" alt="image-20221123101059708" style="zoom:80%;"><p>模块声明在工程下面</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231011109.png" alt="image-20221123101146034" style="zoom:67%;"><h2 id="删除模块-module" tabindex="-1">删除模块(Module) <a class="header-anchor" href="#删除模块-module" aria-label="Permalink to &quot;删除模块(Module)&quot;">​</a></h2><p>（1）移除模块</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231012226.png" alt="image-20221123101214132" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231012765.png" alt="image-20221123101223699" style="zoom:80%;"><p>（2）彻底删除模块</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231012159.png" alt="image-20221123101246060" style="zoom:80%;"><h2 id="导入老师的模块" tabindex="-1">导入老师的模块 <a class="header-anchor" href="#导入老师的模块" aria-label="Permalink to &quot;导入老师的模块&quot;">​</a></h2><p>（1）将老师的模块 teacher_chapter04 整个的复制到自己IDEA项目的路径下</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231013185.png" alt="image-20221123101341112" style="zoom:80%;"><p>接着打开自己IDEA的项目，会在项目目录下看到拷贝过来的module，只不过不是以模块的方式呈现。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231013207.png" alt="image-20221123101358123" style="zoom:67%;"><p>（2）查看Project Structure，选择import module</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231014459.png" alt="image-20221123101426375" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231014019.png" alt="image-20221123101445932" style="zoom:80%;"><p>（3）选择要导入的module：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231015280.png" alt="image-20221123101544174" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231015407.png" alt="image-20221123101554331" style="zoom:80%;"><p>（4）接着可以一路Next下去，最后选择Overwrite</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231016474.png" alt="image-20221123101612380" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231016085.png" alt="image-20221123101629011" style="zoom:80%;"><p>最后点击OK即可了。</p><h2 id="同时打开两个idea项目工程" tabindex="-1">同时打开两个IDEA项目工程 <a class="header-anchor" href="#同时打开两个idea项目工程" aria-label="Permalink to &quot;同时打开两个IDEA项目工程&quot;">​</a></h2><h3 id="_1、两个idea项目工程效果" tabindex="-1">1、两个IDEA项目工程效果 <a class="header-anchor" href="#_1、两个idea项目工程效果" aria-label="Permalink to &quot;1、两个IDEA项目工程效果&quot;">​</a></h3><p>有些同学想要把上课练习代码和作业代码分开两个IDEA项目工程。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231019220.png" alt="image-20221123101955147" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231020776.png" alt="image-20221123102007706" style="zoom:80%;"><h3 id="_2、新建一个idea项目" tabindex="-1">2、新建一个IDEA项目 <a class="header-anchor" href="#_2、新建一个idea项目" aria-label="Permalink to &quot;2、新建一个IDEA项目&quot;">​</a></h3><p>注意：第一次需要新建，之后直接打开项目工程即可</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231020954.png" alt="image-20221123102035882" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231020924.png" alt="image-20221123102045835" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231020180.png" alt="image-20221123102057098" style="zoom:80%;"><h3 id="_3、打开两个idea项目" tabindex="-1">3、打开两个IDEA项目 <a class="header-anchor" href="#_3、打开两个idea项目" aria-label="Permalink to &quot;3、打开两个IDEA项目&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231021342.png" alt="image-20221123102123272" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231021575.png" alt="image-20221123102135483" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231021580.png" alt="image-20221123102150498" style="zoom:80%;"><h2 id="导入非idea工程代码" tabindex="-1">导入非IDEA工程代码 <a class="header-anchor" href="#导入非idea工程代码" aria-label="Permalink to &quot;导入非IDEA工程代码&quot;">​</a></h2><h3 id="_1、导入moudle" tabindex="-1">1、导入Moudle <a class="header-anchor" href="#_1、导入moudle" aria-label="Permalink to &quot;1、导入Moudle&quot;">​</a></h3><p>将相应章节的源文件粘贴到module的src下。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231022331.png" alt="image-20221123102247245" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231023883.png" alt="image-20221123102326790" style="zoom:80%;"><p>打开其中各个源文件，会发现有乱码。比如：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231023010.png" alt="image-20221123102344915" style="zoom:80%;"><h3 id="_2、设置编码" tabindex="-1">2、设置编码 <a class="header-anchor" href="#_2、设置编码" aria-label="Permalink to &quot;2、设置编码&quot;">​</a></h3><p>当前项目是UTF-8。如果原来的.java文件都是GBK的（如果原来.java文件有的是GBK，有的是UTF-8就比较麻烦了）。可以单独把这两个模块设置为GBK编码的。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231024723.png" alt="image-20221123102416624" style="zoom:80%;"><p>改为GBK，确认即可。如图：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231024645.png" alt="image-20221123102431567" style="zoom:80%;"><h1 id="live-templates-代码模板" tabindex="-1">Live Templates 代码模板 <a class="header-anchor" href="#live-templates-代码模板" aria-label="Permalink to &quot;Live Templates 代码模板&quot;">​</a></h1><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304152101625.png" alt="image-20230415210121414" style="zoom:80%;"><h2 id="查看模板后缀补全⭐" tabindex="-1">查看模板后缀补全⭐ <a class="header-anchor" href="#查看模板后缀补全⭐" aria-label="Permalink to &quot;查看模板后缀补全⭐&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231025053.png" alt="image-20221123102522952" style="zoom:80%;"><h2 id="查看live-templates模板实时模板" tabindex="-1">查看Live Templates模板实时模板 <a class="header-anchor" href="#查看live-templates模板实时模板" aria-label="Permalink to &quot;查看Live Templates模板实时模板&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231026006.png" alt="image-20221123102603887" style="zoom:80%;"><p>每次编码过程中，只要输入模板代码缩写，便可帮助我们自动生成相应代码：</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/yAZ9womsrh9moRJYu3szIibtbnkeIBWFyT20oPn5tZnic2ia1oeVHJNb5axsmoD5ctsIuiafaslf4oztHZ6Vul4iawA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>位置<code>Settings -&gt; Editor -&gt; Live Templates</code>。里面有许多系统默认配置，自定义配置可以按如上截图中1~9步骤操作。</p><p>整体配置不是那么复杂，除变量函数外。可以先学习了解看看系统默认配置都是怎么配的，可以尝试去修改它，然后敲敲代码看看是什么效果。</p><p><code>变量函数</code>相关建议多看看官方文档：</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">https://www.jetbrains.com/help/idea/2017.1/live-templates-2.html#predefined_functions</span></span></code></pre></div><p>系统级函数比较丰富，也支持自定义函数，比如结合Groovy脚本。例如下面是变量函数配置来实现打印方法入参：</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">groovyScript(&quot; _1.collect { it + &#39; = {}&#39;}.join(&#39;, &#39;) +   &#39;\&quot;,&#39; + _1.collect {it}.join(&#39;, &#39;)  &quot;, methodParameters())</span></span></code></pre></div><p>输入log缩写，按提示选择，整体效果如下：</p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/yAZ9womsrh9moRJYu3szIibtbnkeIBWFynYHU85nfUMoFNeicqo6iamX90fToyJv7IPIdOFP9EjopCyZKB4JMSVoA/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h2 id="常用代码模板⭐⭐" tabindex="-1">常用代码模板⭐⭐ <a class="header-anchor" href="#常用代码模板⭐⭐" aria-label="Permalink to &quot;常用代码模板⭐⭐&quot;">​</a></h2><h3 id="非空判断" tabindex="-1">非空判断 <a class="header-anchor" href="#非空判断" aria-label="Permalink to &quot;非空判断&quot;">​</a></h3><blockquote><p>变量.null：if(变量 == null)</p><p>变量.nn：if(变量 != null)</p><p>变量.notnull：if(变量 != null)</p><p>ifn：if(xx == null)</p><p>inn：if(xx != null)</p></blockquote><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/tO7NEN7wjr6pdtUuBS9hMYhbXE0icjiby0ibxchmElXrvqz8wmTbK4OXeAQY23SQiaTQCGB2JqBsfTGroExo9qDhxw/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/tO7NEN7wjr6pdtUuBS9hMYhbXE0icjiby0q8F8wnT0gXYPcibtFgkSdTlykL6KsWzAib88bS3W8dEeiacazw7e2ib2hg/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/tO7NEN7wjr6pdtUuBS9hMYhbXE0icjiby0tiasLfeMOQGiaFibn6Vs3LicbKYPS1bNXjFLHopOtxwDBglv8toEgnkSJQ/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/tO7NEN7wjr6pdtUuBS9hMYhbXE0icjiby0wgxBmzamsrFBDuGX3ia3YqhhEs2ibEia4ysPbOjw42kUtBh96cmmiboS9Q/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h3 id="条件判断" tabindex="-1">条件判断 <a class="header-anchor" href="#条件判断" aria-label="Permalink to &quot;条件判断&quot;">​</a></h3><p>定义一个<code>boolean</code>类型的变量<code>flag</code>和一个<code>String</code>类型的变量<code>name</code>来进行测试。</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">boolean</span><span style="color:#A6ACCD;"> flag </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">true;</span></span>
<span class="line"><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> name </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">Java旅途</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">;</span></span></code></pre></div><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">flag</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">if </span><span style="color:#89DDFF;">--</span><span style="color:#C792EA;">-&gt;</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">if</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">flag</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{}</span></span>
<span class="line"><span style="color:#A6ACCD;">flag</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">else </span><span style="color:#89DDFF;">--</span><span style="color:#C792EA;">-&gt;</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">if</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(!</span><span style="color:#A6ACCD;">flag</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{}</span></span>
<span class="line"><span style="color:#A6ACCD;">string</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">null </span><span style="color:#89DDFF;">--</span><span style="color:#C792EA;">-&gt;</span><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;font-style:italic;">if</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">string </span><span style="color:#89DDFF;">==</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">null)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{}</span></span>
<span class="line"><span style="color:#A6ACCD;">string</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">notnull </span><span style="color:#89DDFF;">&amp;</span><span style="color:#A6ACCD;"> string</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">nn </span><span style="color:#89DDFF;">--</span><span style="color:#C792EA;">-&gt;</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">if</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">string </span><span style="color:#89DDFF;">!=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">null)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{}</span></span>
<span class="line"><span style="color:#A6ACCD;">string</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">switch </span><span style="color:#89DDFF;">--</span><span style="color:#C792EA;">-&gt;</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">switch</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">string</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{}</span></span>
<span class="line"><span style="color:#A6ACCD;">flag</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">while </span><span style="color:#89DDFF;">--</span><span style="color:#C792EA;">-&gt;</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">while</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">flag</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{}</span></span></code></pre></div><h3 id="遍历数组和集合" tabindex="-1">遍历数组和集合 <a class="header-anchor" href="#遍历数组和集合" aria-label="Permalink to &quot;遍历数组和集合&quot;">​</a></h3><blockquote><p>数组或集合变量.fori：for循环</p><p>数组或集合变量.for：增强for循环</p><p>数组或集合变量.forr：反向for循环</p><p>数组或集合变量.iter：增强for循环遍历数组或集合</p></blockquote><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/tO7NEN7wjr6pdtUuBS9hMYhbXE0icjiby0lI4s8X2QyBMybqVCkaRfUu6gwvJ6ibsGiaFSbCcLHIrFUojgjVia6GHVA/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/tO7NEN7wjr6pdtUuBS9hMYhbXE0icjiby0XbvGFxQs66k8Rx1j1AlcpfswSpPiaibm8ADaUTRq7P5p2LMsNPNnJ53A/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h4 id="fori" tabindex="-1">fori <a class="header-anchor" href="#fori" aria-label="Permalink to &quot;fori&quot;">​</a></h4><p>输入完，按回车后，光标会在 <code>i&lt;</code>的位置，等待输入临界值。</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">fori       </span><span style="color:#89DDFF;">--</span><span style="color:#C792EA;">-&gt;</span><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;font-style:italic;">for</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;"> i </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">0</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> i </span><span style="color:#89DDFF;">&lt;</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> i</span><span style="color:#89DDFF;">++)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{}</span></span>
<span class="line"><span style="color:#A6ACCD;">param</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">fori </span><span style="color:#89DDFF;">--</span><span style="color:#C792EA;">-&gt;</span><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;font-style:italic;">for</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;"> i </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">0</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> i </span><span style="color:#89DDFF;">&lt;</span><span style="color:#A6ACCD;"> param</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">length</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> i</span><span style="color:#89DDFF;">++)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{}</span></span></code></pre></div><h4 id="forr" tabindex="-1">forr <a class="header-anchor" href="#forr" aria-label="Permalink to &quot;forr&quot;">​</a></h4><p>从最后一个元素进行遍历</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">param</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">forr </span><span style="color:#89DDFF;">--</span><span style="color:#C792EA;">-&gt;</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">for</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;"> i </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> param</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">length </span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">1</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> i </span><span style="color:#89DDFF;">&gt;=</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">0</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> i</span><span style="color:#89DDFF;">--)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{}</span></span></code></pre></div><h4 id="iter" tabindex="-1">iter <a class="header-anchor" href="#iter" aria-label="Permalink to &quot;iter&quot;">​</a></h4><p>用 forEach 的方式循环，在一个数组或者列表变量下方使用。</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">param</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">for </span><span style="color:#89DDFF;">&amp;</span><span style="color:#A6ACCD;"> param</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">iter </span><span style="color:#89DDFF;">--</span><span style="color:#C792EA;">-&gt;</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">for</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> s </span><span style="color:#89DDFF;font-style:italic;">:</span><span style="color:#A6ACCD;"> param</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{}</span></span></code></pre></div><h4 id="itco" tabindex="-1">itco <a class="header-anchor" href="#itco" aria-label="Permalink to &quot;itco&quot;">​</a></h4><p>用迭代器的方式迭代，同样是在一个列表变量下方使用。</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">List</span><span style="color:#89DDFF;">&lt;</span><span style="color:#C792EA;">String</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;"> array </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">ArrayList</span><span style="color:#89DDFF;">&lt;&gt;();</span></span>
<span class="line"><span style="color:#89DDFF;font-style:italic;">for</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">Iterator</span><span style="color:#89DDFF;">&lt;</span><span style="color:#C792EA;">String</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;"> iterator </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> array</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">iterator</span><span style="color:#89DDFF;">();</span><span style="color:#A6ACCD;"> iterator</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">hasNext</span><span style="color:#89DDFF;">();</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> next </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;">  iterator</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">next</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><h3 id="输出语句" tabindex="-1">输出语句 <a class="header-anchor" href="#输出语句" aria-label="Permalink to &quot;输出语句&quot;">​</a></h3><blockquote><p>sout：相当于System.out.println</p><p>souf：带格式化的文本输出，System.out.printf();</p><p>soutm：<strong>打印当前方法的名称</strong></p><p>soutp：<strong>打印当前方法的形参及形参对应的实参值</strong></p><p>soutv：打印方法中声明的最近的变量的值</p><p>变量.sout：打印当前变量值</p><p>变量.soutv：打印当前变量名及变量值</p></blockquote><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">static</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">void</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">m1</span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> name</span><span style="color:#89DDFF;">,</span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> address</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">test.m1</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">);</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// soutm：输出类名.方法名</span></span>
<span class="line"><span style="color:#A6ACCD;">    System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">name = </span><span style="color:#89DDFF;">&quot;</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">+</span><span style="color:#A6ACCD;"> name </span><span style="color:#89DDFF;">+</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">, address = </span><span style="color:#89DDFF;">&quot;</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">+</span><span style="color:#A6ACCD;"> address</span><span style="color:#89DDFF;">);</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// soutp</span></span>
<span class="line"><span style="color:#A6ACCD;">    System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">name = </span><span style="color:#89DDFF;">&quot;</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">+</span><span style="color:#A6ACCD;"> name</span><span style="color:#89DDFF;">);</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;">// soutv：可选输出name还是address</span></span>
<span class="line"><span style="color:#A6ACCD;">    System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">address = </span><span style="color:#89DDFF;">&quot;</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">+</span><span style="color:#A6ACCD;"> address</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231645224.png" alt="image-20221123164511146" style="zoom:80%;"><h3 id="变量和对象声明" tabindex="-1">变量和对象声明 <a class="header-anchor" href="#变量和对象声明" aria-label="Permalink to &quot;变量和对象声明&quot;">​</a></h3><p>新定义一个<code>User</code>类，添加<code>name</code>和<code>age</code>两个属性用来测试。</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">class</span><span style="color:#A6ACCD;"> </span><span style="color:#FFCB6B;">User</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">private</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> name </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">Java旅途</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">private</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;"> age </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">18</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">User</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">User</span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> </span><span style="color:#A6ACCD;font-style:italic;">name</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;"> </span><span style="color:#A6ACCD;font-style:italic;">age</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">this.</span><span style="color:#A6ACCD;">name </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> name</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;">this.</span><span style="color:#A6ACCD;">age </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> age</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">}</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><p>创建一个对象。</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">User</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">new </span><span style="color:#89DDFF;">--&gt;</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">User</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">// Xxx.new 或者 .var ：创建Xxx类的对象，并赋给相应的变量</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">// Xxx.new .field：会将方法内刚创建的Xxx对象抽取为一个属性</span></span>
<span class="line"><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">User</span><span style="color:#89DDFF;">().</span><span style="color:#A6ACCD;">var </span><span style="color:#89DDFF;">--</span><span style="color:#C792EA;">-&gt;</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">User</span><span style="color:#A6ACCD;"> user </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">User</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">User</span><span style="color:#89DDFF;">().</span><span style="color:#A6ACCD;">field </span><span style="color:#89DDFF;">--</span><span style="color:#C792EA;">-&gt;</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">private</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">User</span><span style="color:#A6ACCD;"> user</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> user </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">User</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;">// 对象.cast：将对象进行强转，对象.castvar：将对象强转后，并赋给一个变量</span></span>
<span class="line"><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> object</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">castvar </span><span style="color:#89DDFF;">--</span><span style="color:#C792EA;">-&gt;</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">User</span><span style="color:#A6ACCD;"> user </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">User</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">Object</span><span style="color:#89DDFF;">();</span></span></code></pre></div><h3 id="静态常量声明" tabindex="-1">静态常量声明 <a class="header-anchor" href="#静态常量声明" aria-label="Permalink to &quot;静态常量声明&quot;">​</a></h3><blockquote><p>注意声明位置：不能在方法中声明，包括main方法</p></blockquote><blockquote><p>psf：public static final</p><p>psfi：public static final int</p><p>psfs：public static final String</p><p>prsf：private static final</p><p>St：String</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231650302.png" alt="image-20221123165031192" style="zoom:80%;"><h3 id="快速try-catch" tabindex="-1">快速try...catch <a class="header-anchor" href="#快速try-catch" aria-label="Permalink to &quot;快速try...catch&quot;">​</a></h3><p>手动写try...catch比较麻烦，这时快速try...catch可以给我们节省不少时间，只需加<code>.try</code>即可</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> str </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">123</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">str</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">try</span></span></code></pre></div><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;font-style:italic;">try</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    str</span></span>
<span class="line"><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">catch</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">Exception</span><span style="color:#A6ACCD;"> </span><span style="color:#A6ACCD;font-style:italic;">e</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    e</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">printStackTrace</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><h3 id="快速定义optional" tabindex="-1">快速定义Optional <a class="header-anchor" href="#快速定义optional" aria-label="Permalink to &quot;快速定义Optional&quot;">​</a></h3><p>有时候我们想把某个对象转换成<code>Optional</code>，避免出现空指针问题，只需加<code>.opt</code>即可，具体效果如下：</p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/uL371281oDGPIdY8rfMW5JICc6pYBDevFPibOI03Ro3UfF8DZI8uTlMIng1hgN24SNFkzKJia9AnhxtKINBDribDA/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h3 id="synchronized-上锁" tabindex="-1">synchronized 上锁 <a class="header-anchor" href="#synchronized-上锁" aria-label="Permalink to &quot;synchronized 上锁&quot;">​</a></h3><p>语法：</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">string.synchronized</span></span></code></pre></div><p>效果：</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">synchronized (string) {}</span></span></code></pre></div><h3 id="surround-templates" tabindex="-1">Surround Templates <a class="header-anchor" href="#surround-templates" aria-label="Permalink to &quot;Surround Templates&quot;">​</a></h3><p>这种模板是在选中一段代码后，然后使用快捷键 <code>option</code>+<code>command</code>+<code>j</code>调出提示框，然后选择一个模板类型。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304152102963.png" alt="image-20230415210244780" style="zoom:67%;"><p>这个快捷键是 MAC 系统下的，如果你用的是 windows，可以通过点击 <code>code</code>菜单项，找到 <code>Sorround With</code>，看看快捷键是什么。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304152102116.png" alt="image-20230415210255907" style="zoom:50%;"><p><strong>C</strong></p><p>实现一个 <code>Callable</code></p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">Callable</span><span style="color:#89DDFF;">&lt;</span><span style="color:#C792EA;">Object</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;"> callable </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">Callable</span><span style="color:#89DDFF;">&lt;</span><span style="color:#C792EA;">Object</span><span style="color:#89DDFF;">&gt;()</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">Object</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">call</span><span style="color:#89DDFF;">()</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">throws</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">Exception</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">hello</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">}</span></span>
<span class="line"><span style="color:#89DDFF;">};</span></span></code></pre></div><p><strong>RL 和 WL</strong></p><p>插入一段读锁或写锁加解锁代码。</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#676E95;font-style:italic;">// 要先声明一个读写锁实例</span></span>
<span class="line"><span style="color:#C792EA;">ReadWriteLock</span><span style="color:#A6ACCD;"> readWriteLock </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">ReentrantReadWriteLock</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">readWriteLock</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">readLock</span><span style="color:#89DDFF;">().</span><span style="color:#82AAFF;">lock</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#89DDFF;font-style:italic;">try</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">  System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">hello</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">finally</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">  readWriteLock</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">readLock</span><span style="color:#89DDFF;">().</span><span style="color:#82AAFF;">unlock</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><h2 id="自定义代码模板⭐" tabindex="-1">自定义代码模板⭐ <a class="header-anchor" href="#自定义代码模板⭐" aria-label="Permalink to &quot;自定义代码模板⭐&quot;">​</a></h2><h3 id="自定义后缀补全模板⭐" tabindex="-1">自定义后缀补全模板⭐ <a class="header-anchor" href="#自定义后缀补全模板⭐" aria-label="Permalink to &quot;自定义后缀补全模板⭐&quot;">​</a></h3><h4 id="创建模板" tabindex="-1">创建模板 <a class="header-anchor" href="#创建模板" aria-label="Permalink to &quot;创建模板&quot;">​</a></h4><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231028952.png" alt="image-20221123102857855" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231029515.png" alt="image-20221123102915406" style="zoom:80%;"><h4 id="使用" tabindex="-1">使用 <a class="header-anchor" href="#使用" aria-label="Permalink to &quot;使用&quot;">​</a></h4><blockquote><p>输入String.list，然后回车即可</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231652337.png" alt="image-20221123165212261" style="zoom:80%;"><p>生成如下内容</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">List</span><span style="color:#89DDFF;">&lt;</span><span style="color:#A6ACCD;">String</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">|</span><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;">=</span><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">ArrayList</span><span style="color:#89DDFF;">&lt;&gt;();</span></span></code></pre></div><p>然后在竖线位置输入集合名称即可</p><h3 id="自定义live-templates模板" tabindex="-1">自定义Live Templates模板 <a class="header-anchor" href="#自定义live-templates模板" aria-label="Permalink to &quot;自定义Live Templates模板&quot;">​</a></h3><p>例如：定义sop代表System.out.print();语句</p><p>① 在Live Templates中增加模板</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231029684.png" alt="image-20221123102956604" style="zoom:80%;"><p>②先定义一个模板的组，这样方便管理所有自定义的代码模板</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231030607.png" alt="image-20221123103011539" style="zoom:80%;"><p>③在模板组里新建模板</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231030610.png" alt="image-20221123103034531" style="zoom:80%;"><p>④定义模板（以输出语句为例）</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231030500.png" alt="image-20221123103059402" style="zoom:80%;"><blockquote><p>Abbreviation：模板的缩略名称</p><p>Description：模板的描述</p><p>Template text：模板的代码片段</p><p>模板应用范围。比如点击Define。选择如下：应用在java代码中。</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231031281.png" alt="image-20221123103122198" style="zoom:80%;"><h3 id="模板1-单元测试模板" tabindex="-1">模板1：单元测试模板 <a class="header-anchor" href="#模板1-单元测试模板" aria-label="Permalink to &quot;模板1：单元测试模板&quot;">​</a></h3><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">@</span><span style="color:#C792EA;">Test</span></span>
<span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">void</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">test$var1$</span><span style="color:#89DDFF;">(){</span></span>
<span class="line"><span style="color:#A6ACCD;">	$var2$</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231032848.png" alt="image-20221123103208769" style="zoom:80%;"><h3 id="模板2-创建多线程" tabindex="-1">模板2：创建多线程 <a class="header-anchor" href="#模板2-创建多线程" aria-label="Permalink to &quot;模板2：创建多线程&quot;">​</a></h3><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">Thread</span><span style="color:#89DDFF;">(){</span></span>
<span class="line"><span style="color:#A6ACCD;">	</span><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">void</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">run</span><span style="color:#89DDFF;">(){</span></span>
<span class="line"><span style="color:#A6ACCD;">		$var$</span></span>
<span class="line"><span style="color:#A6ACCD;">	</span><span style="color:#89DDFF;">}</span></span>
<span class="line"><span style="color:#89DDFF;">};</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231032616.png" alt="image-20221123103256536" style="zoom:80%;"><h3 id="模板3-冒泡排序" tabindex="-1">模板3：冒泡排序 <a class="header-anchor" href="#模板3-冒泡排序" aria-label="Permalink to &quot;模板3：冒泡排序&quot;">​</a></h3><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;font-style:italic;">for</span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;"> $INDEX$ </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">1</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> $</span><span style="color:#C792EA;">INDEX</span><span style="color:#A6ACCD;">$ </span><span style="color:#89DDFF;">&lt;</span><span style="color:#A6ACCD;"> $ARRAY$</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">length</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> $</span><span style="color:#C792EA;">INDEX</span><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">++)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">	</span><span style="color:#89DDFF;font-style:italic;">for</span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;"> $INDEX2$ </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">0</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> $</span><span style="color:#C792EA;">INDEX2</span><span style="color:#A6ACCD;">$ </span><span style="color:#89DDFF;">&lt;</span><span style="color:#A6ACCD;"> $ARRAY$</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">length</span><span style="color:#89DDFF;">-</span><span style="color:#A6ACCD;">$</span><span style="color:#C792EA;">INDEX</span><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> $</span><span style="color:#C792EA;">INDEX2</span><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">++)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">		</span><span style="color:#89DDFF;font-style:italic;">if</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">$</span><span style="color:#C792EA;">ARRAY</span><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;">$</span><span style="color:#C792EA;">INDEX2</span><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">]</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;"> $</span><span style="color:#C792EA;">ARRAY</span><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;">$</span><span style="color:#C792EA;">INDEX2</span><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">+</span><span style="color:#F78C6C;">1</span><span style="color:#89DDFF;">]){</span></span>
<span class="line"><span style="color:#A6ACCD;">			$</span><span style="color:#C792EA;">ELEMENT_TYPE</span><span style="color:#A6ACCD;">$ temp </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> $</span><span style="color:#C792EA;">ARRAY</span><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;">$</span><span style="color:#C792EA;">INDEX2</span><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">];</span></span>
<span class="line"><span style="color:#A6ACCD;">			$</span><span style="color:#C792EA;">ARRAY</span><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;">$</span><span style="color:#C792EA;">INDEX2</span><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">]</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> $</span><span style="color:#C792EA;">ARRAY</span><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;">$</span><span style="color:#C792EA;">INDEX2</span><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">+</span><span style="color:#F78C6C;">1</span><span style="color:#89DDFF;">];</span></span>
<span class="line"><span style="color:#A6ACCD;">			$</span><span style="color:#C792EA;">ARRAY</span><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;">$</span><span style="color:#C792EA;">INDEX2</span><span style="color:#A6ACCD;">$</span><span style="color:#89DDFF;">+</span><span style="color:#F78C6C;">1</span><span style="color:#89DDFF;">]</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> temp</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">		</span><span style="color:#89DDFF;">}</span></span>
<span class="line"><span style="color:#A6ACCD;">	</span><span style="color:#89DDFF;">}</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231033635.png" alt="image-20221123103350545" style="zoom:80%;"><h3 id="模板3-计时" tabindex="-1">模板3：计时 <a class="header-anchor" href="#模板3-计时" aria-label="Permalink to &quot;模板3：计时&quot;">​</a></h3><p>比如我最新在做一些系统优化的工作，这个过程中，我会频繁的用 <code>commons-lang3</code>的 <code>StopWatch</code>来看某些方法或者某些代码段的执行时间。比如下面的代码段：</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">StopWatch</span><span style="color:#A6ACCD;"> stopWatch </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">StopWatch</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">代码段</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#A6ACCD;">stopWatch</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">start</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#89DDFF;font-style:italic;">try</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">  Thread</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">sleep</span><span style="color:#89DDFF;">(</span><span style="color:#F78C6C;">1000</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#89DDFF;">}</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">catch</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">InterruptedException</span><span style="color:#A6ACCD;"> </span><span style="color:#A6ACCD;font-style:italic;">e</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">  </span><span style="color:#89DDFF;font-style:italic;">throw</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">RuntimeException</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">e</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span>
<span class="line"><span style="color:#A6ACCD;">stopWatch</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">stop</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">printf</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">执行时间 %s%n</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;">stopWatch</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">toString</span><span style="color:#89DDFF;">());</span></span></code></pre></div><p>由于我比较懒，所以我不想每次都敲重复的内容，连粘贴复制都不想。所以就想到了 Live Template。</p><p>1、打开 IDEA 的设置窗口，找到 Editor 下的 <code>Live Templates</code>，在右侧找到 <code>Java</code>，点击最右侧的加号。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaWSDo4TfyZjMZQa7sqtXu1gpmGR6IQtLgNMlGewaHKewicfupuTDz3uYMoialFYibFYglC8MvqnOo4Rzr0k9nbmHw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>2、输入这个 Template 的名字，到时候可以在编辑器中通过输入这个名字来插入这个模板。</p><p>输入描述，帮助我们记忆。</p><p>最后输入模板的内容。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaWSDo4TfyZjMZQa7sqtXu1gpmGR6IQtLqjk4gt4jn7zZ3VTBut9Tgjrso53zrYIrRcg01eibct97pjujdS0dWng/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>我给这个模板起名为 <code>watch</code>，模板内容如下：</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">StopWatch</span><span style="color:#A6ACCD;"> stopWatch </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">StopWatch</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">$MESSAGE$</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#A6ACCD;">stopWatch</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">start</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">$</span><span style="color:#C792EA;">SELECTION</span><span style="color:#A6ACCD;">$</span></span>
<span class="line"><span style="color:#A6ACCD;">stopWatch</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">stop</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">printf</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">执行时间 %s%n</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;">stopWatch</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">toString</span><span style="color:#89DDFF;">());</span></span></code></pre></div><p><code>$SELECTION$</code>表示选中的部分，我们要监控的正好是某个方法或者某个代码段，所以正好可以用 Surround Templates，并且在内容中用了 <code>$SELECTION$</code>，模板就默认为 Surround Templates了。</p><p><code>$MESSAGE$</code>就是一个占位符的作用，当我们插入这个模板后，光标会定位到这个占位符，我们就可以在需要定制的地方输入我们想要的内容了。在这里呢，由于我的一个方法中可能用到多个 StopWatch，所以正好在这儿占位，给不同的 StopWatch 赋予不同的名字。</p><h2 id="注释模板" tabindex="-1">注释模板 <a class="header-anchor" href="#注释模板" aria-label="Permalink to &quot;注释模板&quot;">​</a></h2><h3 id="类注释" tabindex="-1">类注释 <a class="header-anchor" href="#类注释" aria-label="Permalink to &quot;类注释&quot;">​</a></h3><p>打开 IDEA 的 <code>Settings</code>，点击 <code>Editor--&gt;File and Code Templates</code>，点击右边 <code>File</code>选项卡下面的 <code>Class</code>，在其中添加图中红框内的内容：</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#676E95;font-style:italic;">/**</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> * </span><span style="color:#F78C6C;font-style:italic;">@author</span><span style="color:#676E95;font-style:italic;"> jitwxs</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> * @date ${YEAR}年${MONTH}月${DAY}日 ${TIME}</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> */</span></span></code></pre></div><img src="https://mmbiz.qpic.cn/mmbiz_png/WwPkUCFX4x556Ue2VJr0KuFG8bTr8O5N3T1C939bpicnst4ia9VQUOGeAgCOwLUbvaRxgNquGA9bcDane98XrGEg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片" style="zoom:67%;"><p>在我提供的示例模板中，说明了作者和时间，IDEA 支持的所有的模板参数在下方的 <code>Description</code> 中被列出来。保存后，当你创建一个新的类的时候就会自动添加类注释。如果你想对接口也生效，同时配置上图中的 <code>Interface</code> 项即可。</p><h3 id="方法注释" tabindex="-1">方法注释 <a class="header-anchor" href="#方法注释" aria-label="Permalink to &quot;方法注释&quot;">​</a></h3><p><strong>不同于目前网络上互相复制粘贴的方法注释教程，本文将实现以下功能：</strong></p><ul><li>根据形参数目自动生成 <code>@param</code> 注解</li><li>根据方法是否有返回值智能生成 <code>@Return</code> 注解</li></ul><p>相较于类模板，为方法添加注释模板就较为复杂，首先在 <code>Settings</code> 中点击 <code>Editor--&gt;Live Templates</code>。</p><p>点击最右边的 <code>+</code>，首先选择 <code>2. Template Group...</code> 来创建一个模板分组：</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/WwPkUCFX4x556Ue2VJr0KuFG8bTr8O5NKPDeicdlib5NGuUeUn9iaRZfy84icBF4qVgQHZKsnDs5LfHT99ZCcouCMQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>在弹出的对话框中填写分组名，我这里叫做 userDefine：</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/WwPkUCFX4x556Ue2VJr0KuFG8bTr8O5N65T3gAFT0w1swMJI4Wb7JttwKXAhhZoiabZfX6Am8rMFYBq3K4uP1qg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>然后选中刚刚创建的模板分组 <code>userDefine</code>，然后点击 <code>+</code>，选择 <code>1. Live Template</code>：</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/WwPkUCFX4x556Ue2VJr0KuFG8bTr8O5NPTibeMtFBIdKvFupBC6rx5yVUF4evJ2TjZF7HfTtf901dzPwVclkUOw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>此时就会创建了一个空的模板，我们修改该模板的 <code>Abbreviation</code>、<code>Description</code> 和 <code>Template text</code>。需要注意的是，<code>Abbreviation</code> 必须为 <code>*</code>，最后检查下 <code>Expand with</code> 的值是否为 Enter 键。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/WwPkUCFX4x556Ue2VJr0KuFG8bTr8O5NaFkkON8QhJKaejoHuhYNDickhibMycEcMXWeojRbDSk5mkibaz2uXdmZA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>上图中· <code>Template text</code> 内容如下，请直接复制进去，<strong>需要注意首行没有 <code>/</code>，且 <code>\*</code> 是顶格的</strong>。</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#676E95;font-style:italic;">/*</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> * @author jitwxs</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> * @date $date$ $time$$param$ $return$</span></span>
<span class="line"><span style="color:#676E95;font-style:italic;"> */</span></span></code></pre></div><p>注意到右下角的 <code>No applicable contexts yet</code> 了吗，这说明此时这个模板还没有指定应用的语言：</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/WwPkUCFX4x556Ue2VJr0KuFG8bTr8O5Nh5ndllQJJrKFCiatNAphpoJtSOLr27uQ6qlFdNyV5wIjJFBQPeGvcaw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>点击 <code>Define</code>，在弹框中勾选<code>Java</code>，表示将该模板应用于所有的 Java 类型文件。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/WwPkUCFX4x556Ue2VJr0KuFG8bTr8O5Na3rl9q9iabicdYttU5vAUZYuSicavoSnaUERBEYBZXwueibfKcMYIibGeGw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">设置 applicable contexts</p><p>还记得我们配置 <code>Template text</code> 时里面包含了类似于 <code>$date$</code> 这样的参数，此时 IDEA 还不认识这些参数是啥玩意，下面我们对这些参数进行方法映射，让 IDEA 能够明白这些参数的含义。点击 <code>Edit variables</code> 按钮：</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/WwPkUCFX4x556Ue2VJr0KuFG8bTr8O5NnDYeGZ4Iicpzeel1UkpwZibNaWjhUBdC83TDEQ9v2Y1qFFsFLXOQgKQQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>为每一个参数设置相对应的 <code>Expression</code>：</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/WwPkUCFX4x556Ue2VJr0KuFG8bTr8O5N8ewKfSUaDHCcWeQpA65fUeqsyV4QkRzibaCfPYOkgJppLjvNKESlTrg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">设置 Expression</p><p>需要注意的是，<code>date</code> 和 <code>time</code> 的 <code>Expression</code> 使用的是 IDEA 内置的函数，直接使用下拉框选择就可以了，而 <code>param</code> 这个参数 IDEA 默认的实现很差，因此我们需要手动实现，代码如下：</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#82AAFF;">groovyScript</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">def result = &#39;&#39;;def params = </span><span style="color:#A6ACCD;">\&quot;</span><span style="color:#C3E88D;">${_1}</span><span style="color:#A6ACCD;">\&quot;</span><span style="color:#C3E88D;">.replaceAll(&#39;[</span><span style="color:#A6ACCD;">\\\\</span><span style="color:#C3E88D;">[|</span><span style="color:#A6ACCD;">\\\\</span><span style="color:#C3E88D;">]|</span><span style="color:#A6ACCD;">\\\\</span><span style="color:#C3E88D;">s]&#39;, &#39;&#39;).split(&#39;,&#39;).toList(); for(i = 0; i &lt; params.size(); i++) {if(params[i] != &#39;&#39;)result+=&#39;* @param &#39; + params[i] + ((i &lt; params.size() - 1) ? &#39;</span><span style="color:#A6ACCD;">\\</span><span style="color:#C3E88D;">r</span><span style="color:#A6ACCD;">\\</span><span style="color:#C3E88D;">n &#39; : &#39;&#39;)}; return result == &#39;&#39; ? null : &#39;</span><span style="color:#A6ACCD;">\\</span><span style="color:#C3E88D;">r</span><span style="color:#A6ACCD;">\\</span><span style="color:#C3E88D;">n &#39; + result</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">methodParameters</span><span style="color:#89DDFF;">())</span></span></code></pre></div><p>另外 <code>return</code> 这个参数我也自己实现了下，代码如下：</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#82AAFF;">groovyScript</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">return </span><span style="color:#A6ACCD;">\&quot;</span><span style="color:#C3E88D;">${_1}</span><span style="color:#A6ACCD;">\&quot;</span><span style="color:#C3E88D;"> == &#39;void&#39; ? null : &#39;</span><span style="color:#A6ACCD;">\\</span><span style="color:#C3E88D;">r</span><span style="color:#A6ACCD;">\\</span><span style="color:#C3E88D;">n * @return &#39; + </span><span style="color:#A6ACCD;">\&quot;</span><span style="color:#C3E88D;">${_1}</span><span style="color:#A6ACCD;">\&quot;</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">methodReturnType</span><span style="color:#89DDFF;">())</span></span></code></pre></div><blockquote><p>注：你还注意到我并没有勾选了 <code>Skip if defined</code> 属性，它的意思是如果在生成注释时候如果这一项被定义了，那么鼠标光标就会直接跳过它。我并不需要这个功能，因此有被勾选该属性。</p></blockquote><p>点击 OK 保存设置，大功告成！</p><h3 id="检验成果" tabindex="-1">检验成果 <a class="header-anchor" href="#检验成果" aria-label="Permalink to &quot;检验成果&quot;">​</a></h3><h3 id="类注释-1" tabindex="-1">类注释 <a class="header-anchor" href="#类注释-1" aria-label="Permalink to &quot;类注释&quot;">​</a></h3><p>类注释只有在<strong>新建类时才会自动生成</strong>，效果如下：</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/WwPkUCFX4x556Ue2VJr0KuFG8bTr8O5N2aegYbxPDFGUl1K4qlNSNjKbpfdjiceratzxows19cRKN5K5uqoGLnw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">类注释</p><h3 id="方法注释-1" tabindex="-1">方法注释 <a class="header-anchor" href="#方法注释-1" aria-label="Permalink to &quot;方法注释&quot;">​</a></h3><p>将演示以下几种情况：</p><ol><li>无形参</li><li>单个形参</li><li>多个形参</li><li>无返回值</li><li>有返回值</li></ol><p><img src="https://mmbiz.qpic.cn/mmbiz_png/WwPkUCFX4x556Ue2VJr0KuFG8bTr8O5N3EdzGJa7hIdgHuq386c3ia1eTWRcZroktwqVo2rhY8b4k2TQibaXyQmQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">方法注释</p><h3 id="q-a" tabindex="-1">Q &amp; A <a class="header-anchor" href="#q-a" aria-label="Permalink to &quot;Q &amp; A&quot;">​</a></h3><p><strong>（1）为什么模板的 <code>Abbreviation</code> 一定要叫 <code>\*</code> ？<code>Expand with</code> 要保证是 Enter 键？</strong></p><p>答：因为 IDEA 模板的生成逻辑是 <code>模板名 + 生成键</code>，当生成键是 Enter 时，我们输入 <code>* + Enter</code> 就能够触发模板。</p><p>这也同时说明了为什么注释模板首行是一个 <code>*</code> 了，因为当我们先输入 <code>/*</code>，然后输入 <code>* + Enter</code>，触发模板，首行正好拼成了 <code>/**</code>，符合 Javadoc 的规范。</p><p><strong>（2）注释模板中为什么有一行空的 <code>\*</code>？</strong></p><p>答：因为我习惯在这一行写方法说明，所以就预留了一行空的写，你也可以把它删掉。</p><p><strong>（3）注释模板中 <code>$time$$param$</code> 这两个明明不相干的东西为什么紧贴在一起？</strong></p><p>答：首先网上提供的大部分 param 生成函数在无参情况下仍然会生成一行空的 <code>@param</code>，因此我对param 函数的代码进行修改，使得在无参情况下不生成 <code>@param</code>，但是这就要求 <code>$param$</code> 要和别人处在同一行中，不然没法处理退格。</p><p><strong>（4）为什么 return 参数不使用 <code>methodReturnType()</code>， 而要自己实现？</strong></p><p>答：<code>methodReturnType()</code> 在无返回值的情况下会返回 void，这并没有什么意义，因此我对 methodReturnType() 返回值进行了处理，仅在有返回值时才生成。</p><p><strong>（5）为什么 <code>$return$</code> 不是单独一行？</strong></p><p>答：因为当 <code>methodReturnType()</code> 返回 null 时，无法处理退格问题，原因同第三点。</p><h1 id="常用快捷键" tabindex="-1">常用快捷键 <a class="header-anchor" href="#常用快捷键" aria-label="Permalink to &quot;常用快捷键&quot;">​</a></h1><h2 id="idea的日常快捷键" tabindex="-1">IDEA的日常快捷键 <a class="header-anchor" href="#idea的日常快捷键" aria-label="Permalink to &quot;IDEA的日常快捷键&quot;">​</a></h2><h3 id="第1组-通用型" tabindex="-1">第1组：通用型 <a class="header-anchor" href="#第1组-通用型" aria-label="Permalink to &quot;第1组：通用型&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231523453.png" alt="image-20221123152304364" style="zoom:80%;"><h3 id="第2组-提高编写速度-上" tabindex="-1">第2组：提高编写速度（上） <a class="header-anchor" href="#第2组-提高编写速度-上" aria-label="Permalink to &quot;第2组：提高编写速度（上）&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231523851.png" alt="image-20221123152353744" style="zoom:80%;"><h3 id="第3组-提高编写速度-下" tabindex="-1">第3组：提高编写速度（下） <a class="header-anchor" href="#第3组-提高编写速度-下" aria-label="Permalink to &quot;第3组：提高编写速度（下）&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231527311.png" alt="image-20221123152738216" style="zoom:80%;"><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/LEFcpfxrbq6GN932uicD7rU53aSNMjWtunTWLPs6Ho1ZqhO5vWOmChkqFyZC4oeGV2tibPcmOULNbnib3eoXXttYQ/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h3 id="第4组-类结构、查找和查看源码" tabindex="-1">第4组：类结构、查找和查看源码 <a class="header-anchor" href="#第4组-类结构、查找和查看源码" aria-label="Permalink to &quot;第4组：类结构、查找和查看源码&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231528625.png" alt="image-20221123152808528" style="zoom:80%;"><h3 id="第5组-查找、替换与关闭" tabindex="-1">第5组：查找、替换与关闭 <a class="header-anchor" href="#第5组-查找、替换与关闭" aria-label="Permalink to &quot;第5组：查找、替换与关闭&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231528640.png" alt="image-20221123152845555" style="zoom:80%;"><h3 id="第6组-调整格式" tabindex="-1">第6组：调整格式 <a class="header-anchor" href="#第6组-调整格式" aria-label="Permalink to &quot;第6组：调整格式&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231529197.png" alt="image-20221123152915105" style="zoom:80%;"><h2 id="debug快捷键" tabindex="-1">Debug快捷键 <a class="header-anchor" href="#debug快捷键" aria-label="Permalink to &quot;Debug快捷键&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231529772.png" alt="image-20221123152950678" style="zoom:80%;"><h2 id="查找和替换⭐" tabindex="-1">查找和替换⭐ <a class="header-anchor" href="#查找和替换⭐" aria-label="Permalink to &quot;查找和替换⭐&quot;">​</a></h2><h3 id="查找内容" tabindex="-1">查找内容 <a class="header-anchor" href="#查找内容" aria-label="Permalink to &quot;查找内容&quot;">​</a></h3><h4 id="查找整个项目文件内容" tabindex="-1">查找整个项目文件内容 <a class="header-anchor" href="#查找整个项目文件内容" aria-label="Permalink to &quot;查找整个项目文件内容&quot;">​</a></h4><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.10.30/202210201053786.png" alt="image-20221020105353679" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.10.30/202210201054146.png" alt="image-20221020105442078" style="zoom:80%;"><h4 id="查找某个文件名-按两下shift" tabindex="-1">查找某个文件名（按两下Shift） <a class="header-anchor" href="#查找某个文件名-按两下shift" aria-label="Permalink to &quot;查找某个文件名（按两下Shift）&quot;">​</a></h4><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.10.30/202210201055150.png" alt="image-20221020105538094" style="zoom:80%;"><h4 id="普通查找-ctrl-f" tabindex="-1">普通查找（Ctrl+F） <a class="header-anchor" href="#普通查找-ctrl-f" aria-label="Permalink to &quot;普通查找（Ctrl+F）&quot;">​</a></h4><p>这个就不用说了，最普通的，当前文件查找，这个很常用</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.10.30/202210201056083.png" alt="image-20221020105621018" style="zoom:80%;"><h3 id="替换内容" tabindex="-1">替换内容 <a class="header-anchor" href="#替换内容" aria-label="Permalink to &quot;替换内容&quot;">​</a></h3><h4 id="单页面替换内容ctrl-r" tabindex="-1">单页面替换内容ctrl+r <a class="header-anchor" href="#单页面替换内容ctrl-r" aria-label="Permalink to &quot;单页面替换内容ctrl+r&quot;">​</a></h4><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.10.30/202210201130338.png" alt="image-20221020113044282" style="zoom:80%;"><h4 id="整个项目替换" tabindex="-1">整个项目替换 <a class="header-anchor" href="#整个项目替换" aria-label="Permalink to &quot;整个项目替换&quot;">​</a></h4><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.10.30/202210201131671.png" alt="image-20221020113159620" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.10.30/202210201132935.png" alt="image-20221020113227877" style="zoom:80%;"><h2 id="快速抽取方法⭐" tabindex="-1">快速抽取方法⭐ <a class="header-anchor" href="#快速抽取方法⭐" aria-label="Permalink to &quot;快速抽取方法⭐&quot;">​</a></h2><p>本来快捷键是ctrl+alt+m，但是不知道被哪个软件占用了这个快捷键因此按不出来，可以使用选中代码，然后点击抽取方法，即可实现将代码片段抽取</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211240927104.png" alt="image-20221124092732010" style="zoom:80%;"><p>初始代码</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">class</span><span style="color:#A6ACCD;"> </span><span style="color:#FFCB6B;">HelloModule</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">static</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">void</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">main</span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">String</span><span style="color:#89DDFF;">[]</span><span style="color:#A6ACCD;"> </span><span style="color:#A6ACCD;font-style:italic;">args</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">        System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">hello,module!</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">}</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><p>抽取效果</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211240930038.png" alt="image-20221124093044951" style="zoom:80%;"><h2 id="快速收尾-加分号-加大括号" tabindex="-1">快速收尾(加分号|加大括号) <a class="header-anchor" href="#快速收尾-加分号-加大括号" aria-label="Permalink to &quot;快速收尾(加分号|加大括号)&quot;">​</a></h2><blockquote><p><code>ctrl+shift+enter</code>其实是表示<code>为您收尾</code>的意思，不只是用来给代码加分号的。比如说：</p></blockquote><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouW2SMdln1Ic5gEbcLXWzuhbdYVxPOhqM3oznlKGycKzEOqqlcfLZiciaw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>这段代码，我们还需要为if语句加上大括号才能编译通过，这个时候你直接输入<code>ctrl+shift+enter</code>，<code>IDEA</code>会自动帮你收尾，加上大括号的。</p><h2 id="快捷键查看和修改" tabindex="-1">快捷键查看和修改 <a class="header-anchor" href="#快捷键查看和修改" aria-label="Permalink to &quot;快捷键查看和修改&quot;">​</a></h2><h3 id="_1-查看快捷键" tabindex="-1">1 查看快捷键 <a class="header-anchor" href="#_1-查看快捷键" aria-label="Permalink to &quot;1 查看快捷键&quot;">​</a></h3><p>1、已知快捷键操作名，未知快捷键</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231719156.png" alt="image-20221123171955055" style="zoom:67%;"><p>2、已知快捷键，不知道对应的操作名</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231720073.png" alt="image-20221123172014978" style="zoom:80%;"><h3 id="_3-自定义快捷键" tabindex="-1"><strong>3</strong> 自定义快捷键 <a class="header-anchor" href="#_3-自定义快捷键" aria-label="Permalink to &quot;**3** 自定义快捷键&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231720383.png" alt="image-20221123172040266" style="zoom:80%;"><h3 id="_4-使用其它平台快捷键" tabindex="-1"><strong>4</strong> 使用其它平台快捷键 <a class="header-anchor" href="#_4-使用其它平台快捷键" aria-label="Permalink to &quot;**4** 使用其它平台快捷键&quot;">​</a></h3><p>苹果电脑或者是用惯Eclipse快捷的，可以选择其他快捷键插件。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231721229.png" alt="image-20221123172105130" style="zoom:80%;"><h2 id="多行同时编辑" tabindex="-1">多行同时编辑 <a class="header-anchor" href="#多行同时编辑" aria-label="Permalink to &quot;多行同时编辑&quot;">​</a></h2><blockquote><p>同时按住 Ctrl Shift Alt，然后鼠标左键依次点击要编辑的地方就可以同时编辑了</p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212081907328.png" alt="image-20221208190752234" style="zoom:80%;"><h2 id="快速匹配方法的大括号位置" tabindex="-1">快速匹配方法的大括号位置 <a class="header-anchor" href="#快速匹配方法的大括号位置" aria-label="Permalink to &quot;快速匹配方法的大括号位置&quot;">​</a></h2><blockquote><p><code>ctrl+[ ctrl+]</code> 可以快速跳转到方法大括号的起止位置，配合方法分隔符使用，不怕找不到方法在哪儿分割了</p></blockquote><h2 id="查看历史记录-⭐" tabindex="-1">查看历史记录 ⭐ <a class="header-anchor" href="#查看历史记录-⭐" aria-label="Permalink to &quot;查看历史记录 ⭐&quot;">​</a></h2><blockquote><p>还是以浏览器为例，当我们已经点击很多网页，这时想查看之前看过一个网页，使用后退就会很费劲，需要一个个回退过去查找。这种情况下，直接从历史记录查看将会变得很高效。同样的，IDEA 也提供类似的功能查看历史文件，并且在弹出窗口内可以使用关键键快速查找。快捷键如下：<strong>ctrl + E</strong></p></blockquote><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/LEFcpfxrbq6GN932uicD7rU53aSNMjWtuCnbOzFs3NIDIFsmJrqlltib7dtL2N1DJXOtic0lJX9SoK5g80iaSAn64Q/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h2 id="查看最近修改代码位置-⭐" tabindex="-1">查看最近修改代码位置 ⭐ <a class="header-anchor" href="#查看最近修改代码位置-⭐" aria-label="Permalink to &quot;查看最近修改代码位置 ⭐&quot;">​</a></h2><p>另外 IDEA 中还有可以查看最近修改代码的位置，直接点击快速跳转。<strong>ctrl + shift + E</strong></p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/LEFcpfxrbq6GN932uicD7rU53aSNMjWtuor9jqnMEuiaLFgNWNjl3KDVCNemefhfccc2OxaD5LftibSGMTNcOME3Q/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h2 id="预览某个类的代码" tabindex="-1">预览某个类的代码 <a class="header-anchor" href="#预览某个类的代码" aria-label="Permalink to &quot;预览某个类的代码&quot;">​</a></h2><p>例如我们在test类中，有句代码：<code>People p = new People(); </code>我们想稍微查看一下People这个类，但是tab已经够多了，<code>ctrl+alt+b</code>会打开新的标签，标签多了就混乱了，尤其一堆命名类似的tab,这时候我们可以按<code>ctrl+shift+i</code> 实现预览功能，不占tab</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212121439484.png" alt="image-20221212143929406" style="zoom:80%;"><h2 id="查看方法在哪里被调用" tabindex="-1">查看方法在哪里被调用 <a class="header-anchor" href="#查看方法在哪里被调用" aria-label="Permalink to &quot;查看方法在哪里被调用&quot;">​</a></h2><p><code>ctrl+alt+h</code> 可以清楚看到方法在哪些地方被调用；在知道这个快捷键之前，都是<code>ctrl+h</code>（idea默认 <code>ctrl+shift+f</code>）搜索，肉眼找的…</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202212121441754.png" alt="image-20221212144105659" style="zoom:80%;"><h2 id="查看当前类所有的method" tabindex="-1">查看当前类所有的method <a class="header-anchor" href="#查看当前类所有的method" aria-label="Permalink to &quot;查看当前类所有的method&quot;">​</a></h2><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">Ctrl+F12</span></span></code></pre></div><h2 id="快速查看类、字段的注释" tabindex="-1">快速查看类、字段的注释 <a class="header-anchor" href="#快速查看类、字段的注释" aria-label="Permalink to &quot;快速查看类、字段的注释&quot;">​</a></h2><p>这是一个很有用的小技巧 按F2可以快速查看某个类或某个字段的文档注释 ;基于这点 其它IDE应该也是可以快速查看文档注释内容 不仅仅是idea特性,这也是为什么阿里编码规范里面会明确声明实体类字段需要用文档注释 而不能使用双斜杠// 注释 ,还记得刚看到这个规范的时候 很不理解 特地去百度 看到有人说就是个习惯问题 很显然不能说服人，直到发现F2可以快速查看之后 恍然大悟！</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuf7Trj846CBqvOYJ092l1CWM2FxGTwnn05NhZgm4lnPBHNLH433BOwmicy4coNW3Gc4KBIXGEiaDxFg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuf7Trj846CBqvOYJ092l1CW9biccepWEYkSw2Jut4ibZ3xJRBlKs16RdiaQjOxfIl1Jc1GeGLRrGwLIg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h2 id="快捷键切换回上一个点击开的tab" tabindex="-1">快捷键切换回上一个点击开的tab <a class="header-anchor" href="#快捷键切换回上一个点击开的tab" aria-label="Permalink to &quot;快捷键切换回上一个点击开的tab&quot;">​</a></h2><p>当我们打开了多个tab的时候 ， 想要快速回到上一个点击的tab中 有的时候肉眼很难找</p><p>我们可以用快捷键 <code>alt + ←</code> 键 (eclipse版快捷键 idea默认快捷键需要自测) ，有的时候我们在后面tab编辑了内容 按一次可能不够 需要在多按几次 ,相应的 <code>alt + → </code>切换到下一个点击的tab</p><blockquote><p>常见应用场景： debug发生类跳转时 、利用快捷键在其它类中创建方法时</p></blockquote><p>即使两个tab不相邻 也可以切换回去</p><h2 id="变量批量重命名" tabindex="-1">变量批量重命名 <a class="header-anchor" href="#变量批量重命名" aria-label="Permalink to &quot;变量批量重命名&quot;">​</a></h2><p>有时候手误会把变量名拼写错误，等到自己发现时，这个变量已经被引用了多次，这时再修改，需要把所有引用的地方都修改一遍，这就很麻烦。IDEA 重构功能-重命名（<strong>Rename</strong>），可以修改命名，并且一键替换所有的引用的地方。</p><p>另外函数名、类名修改都可以使用这个快捷键。快捷键如下：<strong>shift + F6</strong></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.1.30/202301131644453.png" alt="image-20230113164409381" style="zoom:67%;"><h2 id="前进-后退" tabindex="-1">前进/后退 <a class="header-anchor" href="#前进-后退" aria-label="Permalink to &quot;前进/后退&quot;">​</a></h2><p>我们使用浏览器的过程，可以点击后退查看之前的浏览记录。在 IDEA 也有同样的功能，当我们编辑代码时，点击查看了调用类实现逻辑，然后可以使用后退快捷键，快速回到刚才待编辑的代码处。</p><p>有后退，当然也有前进啦~ <strong>前进/后退快捷键如下：Ctrl + Alt + Left/Right（方向键）</strong></p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/LEFcpfxrbq6GN932uicD7rU53aSNMjWtuLiaxAlaJichVebmZDqlLROsuwQ4D1T0j1oSibicic8tHBpHJrUyl8PknqWQ/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h1 id="断点调试-debug" tabindex="-1">断点调试(Debug) <a class="header-anchor" href="#断点调试-debug" aria-label="Permalink to &quot;断点调试(Debug)&quot;">​</a></h1><p><a href="https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&amp;mid=2247526655&amp;idx=1&amp;sn=37c90fc993cddd2026629a3d8384167e&amp;chksm=ebd557d3dca2dec52c68b69afb7b746ca4662630c4ff1e34bee887fca2e7fee2694fd0e8e2e7&amp;mpshare=1&amp;scene=23&amp;srcid=08268qnpMKI9jbJcRhSWFsbu&amp;sharer_sharetime=1661475831505&amp;sharer_shareid=29b8a04db1dbd975e3bf4e9f47e7ac67#rd" target="_blank" rel="noreferrer">IDEA断点调试技巧，多张动图包教包会 (qq.com)</a></p><p><a href="https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&amp;mid=2247506835&amp;idx=1&amp;sn=ab279e4c7c4e5768bdc7873d14e5283a&amp;chksm=ebd5e4bfdca26da9d5bc4268b59e98739ecb763b361e8f25426f440307c4e0820e4a7c470483&amp;mpshare=1&amp;scene=23&amp;srcid=0728HBd7UpDQbzTAjL1nF2oH&amp;sharer_sharetime=1659017257513&amp;sharer_shareid=29b8a04db1dbd975e3bf4e9f47e7ac67#rd" target="_blank" rel="noreferrer">在 IDEA 中的各种调试技巧，轻松定位 Bug（超级全面） (qq.com)</a></p><p>编好的程序在执行过程中如果出现错误，该如何查找或定位错误呢？简单的代码直接就可以看出来，但如果代码比较复杂，就需要借助程序调试来查找错误了。</p><p>运行编写好的程序时，可能出现的几种情况：</p><blockquote><p>&gt; 情况1：没有任何bug,程序执行正确！如果出现如下的三种情况，都又必要使用debug</p><p>&gt; 情况2：运行以后，出现了错误或异常信息。但是通过日志文件或控制台，显示了异常信息的位置。</p><p>&gt; 情况3：运行以后，得到了结果，但是结果不是我们想要的。</p><p>&gt; 情况4：运行以后，得到了结果，结果大概率是我们想要的。但是多次运行的话，可能会出现不是我们想要的情 况。比如：多线程情况下，处理线程安全问题。</p></blockquote><h2 id="debug的步骤" tabindex="-1">Debug的步骤 <a class="header-anchor" href="#debug的步骤" aria-label="Permalink to &quot;Debug的步骤&quot;">​</a></h2><p>Debug(调试)程序步骤如下：</p><p>1、添加断点</p><p>2、启动调试</p><p>3、单步执行</p><p>4、观察变量和执行流程，找到并解决问题</p><h3 id="_1、添加断点" tabindex="-1">1、添加断点 <a class="header-anchor" href="#_1、添加断点" aria-label="Permalink to &quot;1、添加断点&quot;">​</a></h3><p>在源代码文件中，在想要设置断点的代码行的前面的标记行处，单击鼠标左键就可以设置断点，在相同位置再次单击即可取消断点。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231533946.png" alt="image-20221123153325861" style="zoom:80%;"><h3 id="_2、启动调试" tabindex="-1">2、启动调试 <a class="header-anchor" href="#_2、启动调试" aria-label="Permalink to &quot;2、启动调试&quot;">​</a></h3><p>IDEA提供多种方式来启动程序(Launch)的调试，分别是通过菜单(Run –&gt; Debug)、图标(“绿色臭虫” 等等</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231534139.png" alt="image-20221123153404040" style="zoom:80%;"><h2 id="基本操作" tabindex="-1">基本操作 <a class="header-anchor" href="#基本操作" aria-label="Permalink to &quot;基本操作&quot;">​</a></h2><h3 id="基础功能" tabindex="-1">基础功能 <a class="header-anchor" href="#基础功能" aria-label="Permalink to &quot;基础功能&quot;">​</a></h3><p>在IDEA中Java相关的最常用几个Debug基础操作如下截图：</p><p><img src="https://mmbiz.qpic.cn/sz_mmbiz_png/yAZ9womsrhiblkXJ6TV6XnN2vlSwKXN9n3BBFLxbC0KlvKibdwfkpmF1dyjCYC5znCFc3bhbnVib0HfMiblreNbJaw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p><strong>图中1-9对应功能作用说明如下：</strong></p><ul><li>**1&gt;.Show Execution Point ：**显示执行点（Alt + F10） **作用：**当我们查看其它方法而忘记了断点执行的位置时，通过该功能可以快速定位到断点所在的位置。</li><li>**2&gt;.Step Over ：**步过（F8） **作用：**执行该方法的下一步（如果该行代码是方法，也不会进入到方法的内部）。</li><li>**3&gt;.Step Into ：**步入（F7） **作用：**如果当前行是方法调用，则进入到该方法的内部，否则跳转到下一行代码。</li><li>**4&gt;.Force Step Into ：**强制步入（Alt + Shift + F7） **作用：**强制进入到具体方法的内部继续执行。</li><li>**5&gt;.Step Out ：**步出（Shift + F8） **作用：**跳转到上一层方法的下一行代码，常和4强制步入配合使用。</li><li>**6&gt;.Drop Frame ：**丢帧 **作用：**丢弃掉当前断点所在方法的栈帧，回退到上一层的方法，但是数据的状态若已改变了则是无法回退到之前的数据状态的。</li><li>**7&gt;.Run to Cursor ：**运行到光标处（Alt + F9） **作用：**运行到光标的所在位置。如果光标之前还有断点，则运行到该断点；如果该光标不在运行路径上，则运行到下一个断点或直接结束。</li><li>**8&gt;.Evaluate Expression ：**执行表达式（Alt + F8） **作用：**可用于执行一段我们实时写的代码。另当我们在测试时，发现某段代码逻辑很难有符合条件的数据时，可以通过该功能直接修改数据，来加快我们的测试。</li><li>**9&gt;.Trace Current Stream Chain ：**Stream调试 **作用：**当我们暂停在Stream的代码行时，可以将Stream的整个处理流程以图形化界面形式展示,可看到每个步处理前后的数据，便于定位排查是哪一步出了问题。</li></ul><h3 id="断点类型" tabindex="-1">断点类型 <a class="header-anchor" href="#断点类型" aria-label="Permalink to &quot;断点类型&quot;">​</a></h3><p>在IDEA中对于JAVA断点分成了如下 4 类（图标均为红色，注意形状不同）：</p><ul><li><strong>1&gt;.行断点（Line Breakpoints）：</strong> **图标：**红色圆形 **作用：**最常用类型。运行时，在断点所在行进行暂停。</li><li><strong>2&gt;.方法断点（Method Breakpoints）：</strong> **图标：**红色菱形 **作用：**在方法入口和出口都会自动暂停。入口处暂停便于让我们从头调试整个方法，出口处暂停便于让我们看到方法执行完时，方法体内各个变量数据状态现况。有时候我们的一个接口会存在很多实现类，我们短时间内难以分析究竟是运行到了哪个实现类中，这个时候就可以使用方法断点，我们将断点打在接口方法上，运行到该方法时，会自动跳到实际执行的实现类，无需通过上下文环境去分析是哪个实现类。</li><li><strong>3&gt;.字段断点（Field Watchpoints）：</strong> **图标：**红色眼睛 **作用：**在具体字段发生变更（默认）或者被访问（需要额外设置）时暂停。</li><li><strong>4&gt;.异常断点（Exception Breakpoints）：</strong> **图标：**红色闪电 **作用：**可以在抛出异常的地方进行暂停。异常断点不是在具体代码行上加断点，而是在断点详情页中直接添加，当运行时，如果抛出所添加的异常，则会自动暂停在抛出异常的代码处。</li></ul><h2 id="应用场景" tabindex="-1">应用场景 <a class="header-anchor" href="#应用场景" aria-label="Permalink to &quot;应用场景&quot;">​</a></h2><p>下面结合现实中常见应用场景，看看上面介绍的断点类型和断点功能具体如何应用。</p><p><strong>2.1、如何做到不用一行行debug而能高效定位到属性变量被访问或被修改？</strong> 应用断点类型：字段断点（Field Watchpoints）</p><p><img src="https://mmbiz.qpic.cn/sz_mmbiz_png/yAZ9womsrhiblkXJ6TV6XnN2vlSwKXN9noDdxqX2R82WaxBv56uaQWgHqk7UEibz5cBK9yDPEdfJgCRJd8Xtibd0A/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>当我们想知道某个属性在什么时候被<code>修改</code>，从入口处开始调试太麻烦，我们可以直接在字段上打上字段断点，这样字段被修改的时候就会自动暂停；如果我们想在字段被<code>访问</code>时也暂停，则可以右键字段断点，将【Field access】勾选上即可。</p><p><strong>2.2、错过了断点，如何不必重新请求或重启进而可以继续调试此断点？</strong> 应用断点功能：丢帧（Drop Frame）</p><p><img src="https://mmbiz.qpic.cn/sz_mmbiz_gif/yAZ9womsrhiblkXJ6TV6XnN2vlSwKXN9nUaq8xxwuGZPQyJtxSZX6FaAhnSC6KdHnsGRwMyxr96lUNE4F9fkoibQ/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>从A方法进入到B方法后，当我们快执行完B方法时，发现某个重要流程被我们跳过了，想再看一下，则此时就可以通过<code>Drop Frame</code>先回退到A方法，然后再次重新进入B方法。</p><p><strong>2.3、如何知道当前具体执行是哪个实现（接口/抽象方法实现太多）？</strong> 应用断点类型：方法断点（Method Breakpoints）</p><p><img src="https://mmbiz.qpic.cn/sz_mmbiz_png/yAZ9womsrhiblkXJ6TV6XnN2vlSwKXN9nxRdIxOBV5HhtbTgNALN20814rl8LLjIpQibxzRJDWeUklB9DtRc4oXA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>时而一个接口/抽象方法会存在很多实现，阅读源码时难以得知究竟是会运行到了具体哪个实现中，此时就可以使用方法断点，我们将断点打在接口方法上，运行到该方法时，会自动跳到实际执行的实现类方法上，而无需通过上下文环境去一点点分析推敲会执行到哪个实现类上。</p><p><strong>2.4、如何设置条件断点，进而不需一层层debug，可直达断点处？</strong> 应用断点功能：断点条件（Condition）</p><p><img src="https://mmbiz.qpic.cn/sz_mmbiz_png/yAZ9womsrhiblkXJ6TV6XnN2vlSwKXN9nscvMUzRVqkhuOLiaj5PZlEEIRC739EqD5yAZu1OJquOKq4guWFw0tHQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>当断点所在的地方执行次数过多时，避免浪费时间层层debug。例如在遍历List当字符串等于abc时存在问题，我们想跳过其它字符串，则可以设置此断点条件str.equals(&quot;abc&quot;)表达式，来达到只在我们关注的abc字符串执行时才暂停下来，其它一路绿灯。</p><p><strong>2.5、如何快速精确定位到抛出具体异常的代码行？</strong> 应用断点类型：异常断点（Exception Breakpoints）</p><p><img src="https://mmbiz.qpic.cn/sz_mmbiz_png/yAZ9womsrhiblkXJ6TV6XnN2vlSwKXN9nCuqH0qppJ9tqD96Q7NB6l5dEe2QsrUsdKtfW4pQXuhxQpBCJgibA3Dg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>当想让在运行时，某个具体异常如MyException只要发生则暂停下来，则就可以使用异常断点功能。当有此异常发生时，则就可以暂停在发生代码行上。</p><p><strong>2.6、如何伪造抛出指定异常便于调试？</strong> 应用断点功能：主动抛异常（Throw Exception）</p><p><img src="https://mmbiz.qpic.cn/sz_mmbiz_png/yAZ9womsrhiblkXJ6TV6XnN2vlSwKXN9nZ7AYhMgtNCmc0pibzk0bqHpPoibvYGG45fUuVlGmIQGaBFr3Nicp3Tqnw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>在开发中，常需要验证程序对异常的处理逻辑是否正确，这个时候就需要我们在程序运行时主动抛出异常才会触发相关逻辑来验证，比如验证：事务是否会回滚、Web层的统一异常处理等等。你是如何做的，来支持此种调试呢？</p><p>简单粗暴地在代码中造异常吗？是可以完成目标。但不够优雅，且太麻烦了，因为测试好还要记得删掉它，若忘记了，那就是直接写了个Bug^_^尤其远程环境Debug时更有用——避免了来回改代码部署重启。</p><p><strong>2.7、多线程情况下如何调试？</strong> 应用断点功能：多线程调试（Suspend）</p><p><img src="https://mmbiz.qpic.cn/sz_mmbiz_png/yAZ9womsrhiblkXJ6TV6XnN2vlSwKXN9nnibpkcSgvflZasJCwXKAaxWTVuMM8YsPjIb1kEbsicVjUWn3UObj9nLg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>Suspend有两种模式：<code>All</code>（暂停全部线程，只能Debug第一个暂停线程）和 <code>Thread</code>（暂停进入断点的线程，并不影响其它线程正常执行。所有进入此断点的线程会依次进行Debug）。</p><p><strong>2.8、Stream该如何调试？</strong> 应用断点功能：Stream调试（Trace Current Stream Chain）</p><p><img src="https://mmbiz.qpic.cn/sz_mmbiz_gif/yAZ9womsrhiblkXJ6TV6XnN2vlSwKXN9nKLlZSiabgNClcSFnKclZrOBcSeELibH5V9FF24orhvRNFFYSNiaEia6yhw/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>合理使用Stream会让代码更加简洁，但是现在存在大量滥用Stream情况，Stream本身就比较抽象，大量滥用会使得Stream代码难以理解和调试。通过该功能便于直观地看到每步骤处理前后的数据情况，利于快速定位排查是哪一步出了问题。</p><h2 id="调试按钮⭐" tabindex="-1">调试按钮⭐ <a class="header-anchor" href="#调试按钮⭐" aria-label="Permalink to &quot;调试按钮⭐&quot;">​</a></h2><h3 id="_1-完整分析⭐⭐" tabindex="-1">1.完整分析⭐⭐ <a class="header-anchor" href="#_1-完整分析⭐⭐" aria-label="Permalink to &quot;1.完整分析⭐⭐&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231534547.png" alt="image-20221123153448445" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231535116.png" alt="image-20221123153506023" style="zoom:80%;"><h3 id="_1-返回断点位置" tabindex="-1">1.返回断点位置 <a class="header-anchor" href="#_1-返回断点位置" aria-label="Permalink to &quot;1.返回断点位置&quot;">​</a></h3><p>1号按钮，这个用的不多，如果你从其他地方想要回到断点位置，就按一下即可，如下GIF所示。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/eQPyBffYbuegRgxhQwguXia8ABzkDsojnwKdYsE3rdgEx3xic2r9WN5LkvPkhoVPhdDQT2sjClYP4w4halaEVnwg/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h3 id="_2-步过" tabindex="-1"><strong>2.步过</strong> <a class="header-anchor" href="#_2-步过" aria-label="Permalink to &quot;**2.步过**&quot;">​</a></h3><p>2号按钮，说人话就是一行行的往下执行，不会进入方法里面，如下所示。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/eQPyBffYbuegRgxhQwguXia8ABzkDsojnmOGMY84ZAiajo5RuRY04iaJy2ohUPZkbR8Ptialp86lksk9icV4FbGdtqA/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h3 id="_3-步入" tabindex="-1"><strong>3.步入</strong> <a class="header-anchor" href="#_3-步入" aria-label="Permalink to &quot;**3.步入**&quot;">​</a></h3><p>3号按钮，可以进入我们自定义的方法，如果是其他类库的方法不会进入，如下所示。扩展：<a href="http://mp.weixin.qq.com/s?__biz=MzIyNDU2ODA4OQ==&amp;mid=2247494250&amp;idx=2&amp;sn=957a5eb085292fb716d5b7db6f8a8628&amp;chksm=e80e5c1cdf79d50adce9e6266562ad1e283a5997b7f3b21f3c394d20819080c2f34aea7b8eaa&amp;scene=21#wechat_redirect" target="_blank" rel="noreferrer">最全的java面试题库</a></p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/eQPyBffYbuegRgxhQwguXia8ABzkDsojndwlScKtyOU6nlkVUhIcM5vKJIl2BicgnxDxD0IyJzCicwQwqISqqXfJA/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h3 id="_5-强制步入-步出" tabindex="-1"><strong>5.强制步入，步出</strong> <a class="header-anchor" href="#_5-强制步入-步出" aria-label="Permalink to &quot;**5.强制步入，步出**&quot;">​</a></h3><p>4号5号按钮，前者可以进入深层的方法，包括官方的源码，后者就是从对应的方法中出来，演示如下。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/eQPyBffYbuegRgxhQwguXia8ABzkDsojniaKsUh5DzNGrfm4gxFngj3GxCGKVezhDr1gJrgXFgoQFpgcV04RN7dQ/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h3 id="_6-回退断点" tabindex="-1"><strong>6.回退断点</strong> <a class="header-anchor" href="#_6-回退断点" aria-label="Permalink to &quot;**6.回退断点**&quot;">​</a></h3><p>6号按钮是很特殊的，如果你的代码中没有调用其他地方的方法，那么是呈灰色的，无法使用，只有进入更深层的方法，才能够使用，其实就是后悔药，我们很多时候调试时不小心按的快了点，很容易错过想看的位置，只能再次重启吗？不，使用这个drop frame 就可以了，演示如下。</p><p>可以看到，这里往下执行了add，但是还没有执行完，按这个按钮，再次回到了调用方法之前，但对于数据库插入等操作，其实是无法回退的，这里的回退只是因为记录了栈信息才能够做到的。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/eQPyBffYbuegRgxhQwguXia8ABzkDsojnpDibzHMPwB9eNlFSOFodibnRHicgBNsruttcqQkrv2ueTU6pCEiajvhTew/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片">但是要注意，如果你某个方法调用完毕了，你想再回去那就没有办法了。</p><h3 id="_7-断点跳到光标处" tabindex="-1"><strong>7.断点跳到光标处</strong> <a class="header-anchor" href="#_7-断点跳到光标处" aria-label="Permalink to &quot;**7.断点跳到光标处**&quot;">​</a></h3><p>7号按钮也用的不多，主要是为了快速跳转到光标指向的那一行，如下所示。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/eQPyBffYbuegRgxhQwguXia8ABzkDsojnqzZnMFMh7XZ6QQPYtdgbObwCicpV60BaWpQ2IenZYaz9Mn0SgMFDvBg/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h3 id="_8-表达式计算" tabindex="-1"><strong>8.表达式计算</strong> <a class="header-anchor" href="#_8-表达式计算" aria-label="Permalink to &quot;**8.表达式计算**&quot;">​</a></h3><p>8号按钮是计算表达式的，我们模拟从数据库获取集合，用表达式查询对应的元素，如下所示。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/eQPyBffYbuegRgxhQwguXia8ABzkDsojnZnwXdicxkdZibQZpPsTj1ibwlv4vKVDCzb7GTA7Cd2XVLVFj607EWJMmw/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h3 id="_9-恢复程序" tabindex="-1"><strong>9.恢复程序</strong> <a class="header-anchor" href="#_9-恢复程序" aria-label="Permalink to &quot;**9.恢复程序**&quot;">​</a></h3><p>9号按钮称为 <code>Resume Program</code>，能够跳转到指定的断点处，我们在10行和第100行各加一个断点，需要点几下该按钮跳转到100行呢？答案是一次即可，第一次断点会在第10行停下，点击改按钮直接飞越90行到第100行，如下所示。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/eQPyBffYbuegRgxhQwguXia8ABzkDsojnUx2qtYbVNfYiaZ9UWoZKgUwdTLFTtfSIbvGOzA48zk3N3ib2soYocnfA/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h3 id="_10-停止程序" tabindex="-1"><strong>10.停止程序</strong> <a class="header-anchor" href="#_10-停止程序" aria-label="Permalink to &quot;**10.停止程序**&quot;">​</a></h3><p>10号按钮就是停止调试，但是注意，即便停止了调试，程序也会继续运行下去，如何想让他就在断点处停止呢？后面我会说到。</p><h3 id="_11-查看所有断点" tabindex="-1"><strong>11.查看所有断点</strong> <a class="header-anchor" href="#_11-查看所有断点" aria-label="Permalink to &quot;**11.查看所有断点**&quot;">​</a></h3><p>11号按钮打开又别有乾坤，基本功能如下图所示，主要是设置，查看断点信息</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241105430.png" alt="image-20221124110558384" style="zoom:80%;"><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuegRgxhQwguXia8ABzkDsojnmPOeY07xwe7qFhDUr1eDC34Gt2vpw1wObzVhXOtz6WWlIgRoW5XvUw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h3 id="_12-禁用断点" tabindex="-1"><strong>12.禁用断点</strong> <a class="header-anchor" href="#_12-禁用断点" aria-label="Permalink to &quot;**12.禁用断点**&quot;">​</a></h3><p>12号按钮就简单了，暂时禁用掉断点，方便程序继续执行，一般配合 <code>Resume Program</code>。</p><h3 id="_13-其他" tabindex="-1"><strong>13.其他</strong> <a class="header-anchor" href="#_13-其他" aria-label="Permalink to &quot;**13.其他**&quot;">​</a></h3><p>13号其实不是按钮，而是一块区域，这里面存放了很多变量的信息，方便我们查看。</p><p>14号按钮其实之前被我忽略掉了，这次拿出来讲一下，在watch可以监控变量的变化，有同学说，中间的变量栏也可以看啊，但是单独拉出来，看起来更加的方便，演示如下。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/eQPyBffYbuegRgxhQwguXia8ABzkDsojngXuHVQlPECnI9xBdAFa7KT08NfSXwGv4ttupTgnZRAuibAbS1w9gzzQ/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h2 id="多种debug情况介绍" tabindex="-1">多种Debug情况介绍 <a class="header-anchor" href="#多种debug情况介绍" aria-label="Permalink to &quot;多种Debug情况介绍&quot;">​</a></h2><h3 id="_1-行断点" tabindex="-1">1 行断点 <a class="header-anchor" href="#_1-行断点" aria-label="Permalink to &quot;1 行断点&quot;">​</a></h3><p>断点打在代码所在的行上。执行到此行时，会停下来。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241051512.png" alt="image-20221124105102448" style="zoom:80%;"><h3 id="_2-方法断点" tabindex="-1"><strong>2</strong> 方法断点 <a class="header-anchor" href="#_2-方法断点" aria-label="Permalink to &quot;**2** 方法断点&quot;">​</a></h3><p>断点设置在方法的签名上，默认当进入时，断点可以被唤醒。也可以设置在方法退出时，断点也被唤醒</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231536460.png" alt="image-20221123153655360" style="zoom:80%;"><blockquote><p>在多态的场景下，在父类或接口的方法上打断点，会自动调入到子类或实现类的方法</p></blockquote><p>方法断点是不是用在普通方法上的，最好的用法是在接口上使用，当我们在调试源码的时候，如果在接口上打了断点，再往下走，可以直接跳转到实现类的实现方法上，而不需要我们一个个的去找。</p><p>案例中，有一个接口<code>DemoInterface</code>，它有两个实现类，让我们看下效果吧，演示如下。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuegRgxhQwguXia8ABzkDsojnCKTlubtMOID8ibV7qriaVrKGp70pk7xJhREwib61djMTmDvgPHVAMiaOZg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">注意，方法断点是一个菱形标志。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/eQPyBffYbuegRgxhQwguXia8ABzkDsojnRq1AuXHOhpJ6ib31opzvyqBP9Mh19GP7FGQ5iaiafomic4fDIMib1sT457A/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><p>其实可以直接在接口方法上打断点，直接跳转到对应的实现方法的，这里是为了放慢演示速度。</p><h3 id="_3-字段断点" tabindex="-1">3 字段断点 <a class="header-anchor" href="#_3-字段断点" aria-label="Permalink to &quot;3 字段断点&quot;">​</a></h3><blockquote><p>在类的属性声明上打断点，默认对属性的修改操作进行监控，<strong>查看变量修改情况</strong></p></blockquote><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231538235.png" alt="image-20221123153845141" style="zoom:67%;"><p>属性断点是打在属性上的，我们无需再<code>getter setter</code>方法上打断点，在属性上打上断点，就会出现一个小眼睛的标志，如下所示。在眼睛上点击右键可以设置。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuegRgxhQwguXia8ABzkDsojnvYDvgA3ff9SbIIGib6vRxFiaHCkqsWBQG0uTJj7hdvvgPqCfwjt4PNMg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>我们一般是通过getter，setter方法设值的，所以就会在这两个方法上停留。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuegRgxhQwguXia8ABzkDsojnyJ8d4Qfsg7jNtQ0IBH7wEIic5iblCic04xre4bS6Yl34iagm9Rl7OB8kwQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/eQPyBffYbuegRgxhQwguXia8ABzkDsojnwSMXj7dxAVSficiblxtksRg1megovw6FUbh9icEbJlAypX6mkztCeVuZw/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h3 id="_4-条件断点⭐" tabindex="-1">4 条件断点⭐ <a class="header-anchor" href="#_4-条件断点⭐" aria-label="Permalink to &quot;4 条件断点⭐&quot;">​</a></h3><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">int</span><span style="color:#89DDFF;">[]</span><span style="color:#A6ACCD;"> arr </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">int</span><span style="color:#89DDFF;">[]{</span><span style="color:#F78C6C;">1</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">2</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">3</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">4</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">5</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">6</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">7</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">8</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">9</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">10</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">11</span><span style="color:#89DDFF;">,</span><span style="color:#F78C6C;">12</span><span style="color:#89DDFF;">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:#89DDFF;font-style:italic;">for</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;"> i </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">0</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> i </span><span style="color:#89DDFF;">&lt;</span><span style="color:#A6ACCD;"> arr</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">length</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> i</span><span style="color:#89DDFF;">++)</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">int</span><span style="color:#A6ACCD;"> target </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> arr</span><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;">i</span><span style="color:#89DDFF;">];</span></span>
<span class="line"><span style="color:#A6ACCD;">    System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">target</span><span style="color:#89DDFF;">);</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><p>针对上述代码，在满足arr[i] % 3 == 0的条件下，执行断点。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231539509.png" alt="image-20221123153931421" style="zoom:80%;"><p>启动DEBUG，查看效果</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241101318.png" alt="image-20221124110132265" style="zoom:80%;"><p>跳转到下一个断点位置，注意是点击它，而不是点击横栏上的单步执行</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241102906.png" alt="image-20221124110244854" style="zoom:80%;"><p>可以看到，立即进行了按条件跳转</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241103537.png" alt="image-20221124110325487" style="zoom:80%;"><p>循环中经常用到这个技巧，比如：遍历1个大List的过程中，想让断点停在某个特定值。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.5.13/202205150941840.png" alt="image-20220515094125787" style="zoom:80%;"><p>示例二</p><p>参考上图，在断点的位置，右击断点旁边的小红点，会出来一个界面，在Condition这里填入断点条件即可，这样调试时，就会自动停在i=10的位置</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.5.13/202205150941069.png" alt="image-20220515094143032" style="zoom:80%;"><p>我想要在某个条件满足的时候打上断点，而不想一步步的走下去，有什么办法吗？当然有，在断点处右击，在<code>condition</code>里填入相应的条件即可，演示如下。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/eQPyBffYbuegRgxhQwguXia8ABzkDsojn4usI8hzHKNgMj1r7ia7iaJiaCngaFM23C1sBz7vayKlUYSz0xY314WJLg/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><h3 id="_5-异常断点" tabindex="-1">5 异常断点 <a class="header-anchor" href="#_5-异常断点" aria-label="Permalink to &quot;5 异常断点&quot;">​</a></h3><p>对异常进行跟踪。如果程序出现指定异常，程序就会执行断点，自动停住。</p><p>通过下图的方式，对指定的异常进行监控：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231540781.png" alt="image-20221123154021679" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241106686.png" alt="image-20221124110648632" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241107388.png" alt="image-20221124110700343" style="zoom:80%;"><p>执行前不需要标记异常，只需要执行debug，就会自动显示闪电符号的异常</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241109324.png" alt="image-20221124110900273" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241109030.png" alt="image-20221124110910991" style="zoom:80%;"><p>在线上由于空指针出现了BUG，我们想快速定位到哪里出现了空指针，应该怎么做呢，答案就是，异常断点！</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuegRgxhQwguXia8ABzkDsojn1AMXg4J9BibCc3ic2EMpqTe2bHCX6aE4icJNrdkDQB30SIUc6vrHicHFzw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">注意，异常断点是一个闪电的标志。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/eQPyBffYbuegRgxhQwguXia8ABzkDsojn1MiaNMulv1zUxjyvM6I9NRT2bDp2uYZdnJj5EMuiaAk2YT9obq4ZotEg/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><p>可以看到，我们在全局打了个空指针断点，只要哪里出现了空指针，就会在那里停止，太方便了！</p><h3 id="_6-线程调试" tabindex="-1">6 线程调试 <a class="header-anchor" href="#_6-线程调试" aria-label="Permalink to &quot;6 线程调试&quot;">​</a></h3><p>示例一</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231540998.png" alt="image-20221123154055904" style="zoom:80%;"><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">Thread2</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">equals</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">Thread</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">currentThread</span><span style="color:#89DDFF;">().</span><span style="color:#82AAFF;">getName</span><span style="color:#89DDFF;">())</span></span></code></pre></div><p>示例二</p><p>多线程同时运行时，谁先执行，谁后执行，完全是看CPU心情的，无法控制先后，运行时可能没什么问题，但是调试时就比较麻烦了，最明显的就是断点乱跳，一会儿停这个线程，一会儿停在另一个线程，比如下图：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.5.13/202205150943491.png" alt="image-20220515094311442" style="zoom:80%;"><p>如果想希望下一个断点位置是第2句诗句，可能要失望了：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.5.13/202205150943858.png" alt="image-20220515094334810" style="zoom:80%;"><p>如果想让线程在调试时，想按自己的愿意来，让它停在哪个线程就停在哪个线程，可以在图中3个断点的小红点上右击，<img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.5.13/202205150944652.png" alt="image-20220515094402610" style="zoom:80%;"></p><p>即：Suspend挂起的条件是按每个线程来，而非All。把这3个断点都这么设置后，再来一发试试</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.5.13/202205150949930.png" alt="image-20220515094913756" style="zoom:80%;"><p>注意上图中的红框位置，断点停下来时，这个下拉框可以看到各个线程（注：给线程起个容易识别的名字是个好习惯！），我们可以选择线程“天空中的飞鸟”</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.5.13/202205150949639.png" alt="image-20220515094933514" style="zoom:80%;"><p>断点如愿停在了第2句诗。</p><h3 id="_7-强制结束" tabindex="-1">7 强制结束 <a class="header-anchor" href="#_7-强制结束" aria-label="Permalink to &quot;7 强制结束&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241118361.png" alt="image-20221124111819305" style="zoom:80%;"><p>进入insert方法，在数据还没写入数据表之前，自己就发现问题了，需要强制结束</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241115377.png" alt="image-20221124111546321" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231543005.png" alt="image-20221123154332901" style="zoom:80%;"><p>执行按步骤执行，查看结果</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241118405.png" alt="image-20221124111845359" style="zoom:80%;"><h3 id="_8-stream流断点" tabindex="-1">8 stream流断点 <a class="header-anchor" href="#_8-stream流断点" aria-label="Permalink to &quot;8 stream流断点&quot;">​</a></h3><p>我们使用流的时候，很难看到中间做了什么，但其实idea就帮我们解决了，我用断点调试下面代码，给大家演示下。</p><p>其实只需要找到这个按钮就行了</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuegRgxhQwguXia8ABzkDsojnzmBZhQI7OgbIAHmCIF0r4LB7lLa9r3sr20tcHlodWbjAAxiap81K5Nw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">List</span><span style="color:#89DDFF;">&lt;</span><span style="color:#C792EA;">Integer</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;"> list </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">ArrayList</span><span style="color:#89DDFF;">&lt;&gt;(</span><span style="color:#A6ACCD;">Arrays</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">asList</span><span style="color:#89DDFF;">(</span><span style="color:#F78C6C;">1</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">3</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">3</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">4</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">4</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">4</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">5</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">6</span><span style="color:#89DDFF;">,</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">78</span><span style="color:#89DDFF;">));</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#C792EA;">List</span><span style="color:#89DDFF;">&lt;</span><span style="color:#C792EA;">Integer</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;"> collect </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> list</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">stream</span><span style="color:#89DDFF;">()</span></span>
<span class="line"><span style="color:#89DDFF;">          </span><span style="color:#676E95;font-style:italic;">//先将偶数筛选，再去重，返回集合</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">filter</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">s </span><span style="color:#C792EA;">-&gt;</span><span style="color:#A6ACCD;"> s </span><span style="color:#89DDFF;">%</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">2</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">==</span><span style="color:#A6ACCD;"> </span><span style="color:#F78C6C;">0</span><span style="color:#89DDFF;">)</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">distinct</span><span style="color:#89DDFF;">()</span></span>
<span class="line"><span style="color:#A6ACCD;">                </span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">collect</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">Collectors</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">toList</span><span style="color:#89DDFF;">());</span></span></code></pre></div><p><img src="https://mmbiz.qpic.cn/mmbiz_gif/eQPyBffYbuegRgxhQwguXia8ABzkDsojnt51lpDDoc70xYEcw9Kltu8RX8EAuEU1lnKMJoUusMyucldLI2mewjQ/640?wx_fmt=gif&amp;wxfrom=5&amp;wx_lazy=1" alt="图片"></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241026928.png" alt="image-20221124102635806" style="zoom:80%;"><h2 id="自定义调试数据视图" tabindex="-1">自定义调试数据视图 <a class="header-anchor" href="#自定义调试数据视图" aria-label="Permalink to &quot;自定义调试数据视图&quot;">​</a></h2><p>调试窗口空白处右键</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231544345.png" alt="image-20221123154412223" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231544871.png" alt="image-20221123154433769" style="zoom:80%;"><h2 id="常见问题" tabindex="-1">常见问题 <a class="header-anchor" href="#常见问题" aria-label="Permalink to &quot;常见问题&quot;">​</a></h2><p>问题：使用Step Into时，会出现无法进入源码的情况。如何解决？</p><p>方案1：使用 force step into 即可</p><p>方案2：点击Setting -&gt; Build,Execution,Deployment -&gt; Debugger -&gt; Stepping</p><p>把Do not step into the classess中的 java.* 、 javax.* 取消勾选即可。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231545655.png" alt="image-20221123154526557" style="zoom:80%;"><h1 id="创建不同类型的工程" tabindex="-1">创建不同类型的工程 <a class="header-anchor" href="#创建不同类型的工程" aria-label="Permalink to &quot;创建不同类型的工程&quot;">​</a></h1><h2 id="_1-创建java工程" tabindex="-1">1 创建Java工程 <a class="header-anchor" href="#_1-创建java工程" aria-label="Permalink to &quot;1 创建Java工程&quot;">​</a></h2><p>在工程上，右键- New - Module，如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231957983.png" alt="image-20221123195758896" style="zoom:80%;"><p>指明Java工程的名称及使用的JDK版本</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231958669.png" alt="image-20221123195825549" style="zoom:80%;"><p>创建包：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231958960.png" alt="image-20221123195846878" style="zoom:80%;"><p>提供包名：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231959803.png" alt="image-20221123195903709" style="zoom:80%;"><p>在包下创建类，即可：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231959832.png" alt="image-20221123195924751" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231959614.png" alt="image-20221123195941536" style="zoom:80%;"><p>测试代码：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211232000390.png" alt="image-20221123200017303" style="zoom:80%;"><h2 id="_2-创建java-web工程" tabindex="-1">2 创建Java Web工程 <a class="header-anchor" href="#_2-创建java-web工程" aria-label="Permalink to &quot;2 创建Java Web工程&quot;">​</a></h2><h3 id="_1-idea中配置tomcat" tabindex="-1">1 IDEA中配置Tomcat <a class="header-anchor" href="#_1-idea中配置tomcat" aria-label="Permalink to &quot;1 IDEA中配置Tomcat&quot;">​</a></h3><p>在IDEA中配置Tomcat之前，需要保证已经安装并配置了Tomcat的环境变量。如果没有安装并配置，可以</p><p>参考尚硅谷宋红康Tomcat8.5快速部署.docx 配置完成以后，在命令行输入：<strong>catalina run</strong> 。能够启动tomcat，则证明安装配置成功。下面看如何在IDEA中配置：</p><h2 id="_3-创建maven-java工程" tabindex="-1">3 创建Maven Java工程 <a class="header-anchor" href="#_3-创建maven-java工程" aria-label="Permalink to &quot;3 创建Maven Java工程&quot;">​</a></h2><h3 id="_1-maven的介绍" tabindex="-1">1 Maven的介绍 <a class="header-anchor" href="#_1-maven的介绍" aria-label="Permalink to &quot;1 Maven的介绍&quot;">​</a></h3><p>Maven是一款自动化构建工具，专注服务于Java平台的 项目构建 和 依赖管理 。在JavaEE开发的历史上构</p><p>建工具的发展也经历了一系列的演化和变迁：Make→Ant→Maven→Gradle→其他……</p><p>构建环节：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241501759.png" alt="image-20221124150157700" style="zoom:80%;"><blockquote><p>①清理：删除以前的编译结果，为重新编译做好准备。</p><p>②编译：将Java源程序编译为字节码文件。</p><p>③测试：运行单元测试用例程序，确保项目在迭代开发过程中关键点的正确性。</p><p>④报告：测试程序的结果。</p><p>⑤打包：将java项目打成jar包；将Web项目打成war包。</p><p>⑥安装：将jar包或war包安装到本地仓库中。</p><p>⑦部署：将jar或war从Maven仓库中部署到Web服务器上运行。</p></blockquote><h3 id="_2-maven的配置" tabindex="-1">2 Maven的配置 <a class="header-anchor" href="#_2-maven的配置" aria-label="Permalink to &quot;2 Maven的配置&quot;">​</a></h3><p>maven的下载 – 解压 – 环境变量的配置这里就不赘述了，下面直接整合Maven。选择自己Maven的目录，和settings文件，然后配置自己的仓库reposiroty</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241503240.png" alt="image-20221124150328169" style="zoom:80%;"><h3 id="_3-maven-java工程的创建" tabindex="-1">3 Maven Java工程的创建 <a class="header-anchor" href="#_3-maven-java工程的创建" aria-label="Permalink to &quot;3 Maven Java工程的创建&quot;">​</a></h3><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241504358.png" alt="image-20221124150404295" style="zoom:80%;"><p>指明当前maven工程的名称、模板等信息。这里要求一个项目组的jdk版本必须一致。</p><p>通过坐标，就可以定位仓库中具体的jar包。如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241504204.png" alt="image-20221124150440128" style="zoom:80%;"><p>新创建的maven 的java工程缺少相应的resources文件目录，需要创建如下：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241505426.png" alt="image-20221124150500362" style="zoom:80%;"><p>指明main下resources的文件目录类型：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241505469.png" alt="image-20221124150523393" style="zoom:80%;"><p>类似的操作test目录下，提供resources即可。这里说明Maven的java工程的目录结构：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241506177.png" alt="image-20221124150606128" style="zoom:80%;"><ul><li>main目录用于存放主程序。</li><li>test目录用于存放测试程序。</li><li>java目录用于存放源代码文件。</li><li>resources目录用于存放配置文件和资源文件。</li></ul><h3 id="_4-编写代码及测试" tabindex="-1">4 编写代码及测试 <a class="header-anchor" href="#_4-编写代码及测试" aria-label="Permalink to &quot;4 编写代码及测试&quot;">​</a></h3><p>第1步：创建Maven的核心配置文件pom.xml</p><div class="language-xml"><button title="Copy Code" class="copy"></button><span class="lang">xml</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#676E95;font-style:italic;">&lt;!-- 添加Junit的依赖   --&gt;</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">dependency</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">groupId</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">junit</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">groupId</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">artifactId</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">junit</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">artifactId</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">version</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">4.12</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">version</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">&lt;</span><span style="color:#F07178;">scope</span><span style="color:#89DDFF;">&gt;</span><span style="color:#A6ACCD;">test</span><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">scope</span><span style="color:#89DDFF;">&gt;</span></span>
<span class="line"><span style="color:#89DDFF;">&lt;/</span><span style="color:#F07178;">dependency</span><span style="color:#89DDFF;">&gt;</span></span></code></pre></div><p>第2步：编写主程序代码</p><p>在src/main/java/com/atguigu/java目录下新建文件HelloMaven.java</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">class</span><span style="color:#A6ACCD;"> </span><span style="color:#FFCB6B;">HelloMaven</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">{</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">hello</span><span style="color:#89DDFF;">(</span><span style="color:#C792EA;">String</span><span style="color:#A6ACCD;"> </span><span style="color:#A6ACCD;font-style:italic;">message</span><span style="color:#89DDFF;">){</span></span>
<span class="line"><span style="color:#A6ACCD;">        </span><span style="color:#89DDFF;font-style:italic;">return</span><span style="color:#A6ACCD;"> message</span><span style="color:#89DDFF;">;</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#89DDFF;">}</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><p>第3步：编写测试代码</p><p>在/src/test/java/com/atguigu/java目录下新建测试文件HelloMavenTest.java</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#89DDFF;">@</span><span style="color:#C792EA;">Test</span></span>
<span class="line"><span style="color:#C792EA;">public</span><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">void</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">testHelloMaven</span><span style="color:#89DDFF;">(){</span></span>
<span class="line"><span style="color:#A6ACCD;">    </span><span style="color:#C792EA;">HelloMaven</span><span style="color:#A6ACCD;"> helloMaven </span><span style="color:#89DDFF;">=</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;font-style:italic;">new</span><span style="color:#A6ACCD;"> </span><span style="color:#82AAFF;">HelloMaven</span><span style="color:#89DDFF;">();</span></span>
<span class="line"><span style="color:#A6ACCD;">    System</span><span style="color:#89DDFF;">.</span><span style="color:#A6ACCD;">out</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">println</span><span style="color:#89DDFF;">(</span><span style="color:#A6ACCD;">helloMaven</span><span style="color:#89DDFF;">.</span><span style="color:#82AAFF;">hello</span><span style="color:#89DDFF;">(</span><span style="color:#89DDFF;">&quot;</span><span style="color:#C3E88D;">Maven ^_^</span><span style="color:#89DDFF;">&quot;</span><span style="color:#89DDFF;">));</span></span>
<span class="line"><span style="color:#89DDFF;">}</span></span></code></pre></div><p>第4步：运行几个基本的Maven命令</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241512821.png" alt="image-20221124151220759" style="zoom:80%;"><p>目录下也会有对应的生命周期。其中常用的是：clean、compile、package、install。比如这里install，如果其他项目需要将这里的模块作为依赖使用，那就可以install。安装到本地仓库的位置。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241512846.png" alt="image-20221124151250791" style="zoom:80%;"><h1 id="关联数据库" tabindex="-1">关联数据库 <a class="header-anchor" href="#关联数据库" aria-label="Permalink to &quot;关联数据库&quot;">​</a></h1><h2 id="_1-创建数据库连接" tabindex="-1">1 创建数据库连接 <a class="header-anchor" href="#_1-创建数据库连接" aria-label="Permalink to &quot;1 创建数据库连接&quot;">​</a></h2><p>找到数据库选项</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231739033.png" alt="image-20221123173956923" style="zoom:80%;"><p>添加指定数据库：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231745165.png" alt="image-20221123174523056" style="zoom:80%;"><p>配置MySQL数据库的详细信息：</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231748269.png" alt="image-20221123174859172" style="zoom:80%;"><blockquote><p>表面上很多人认为配置 Database 就是为了有一个 GUI 管理数据库功能，但是这并不是 IntelliJ IDEA 的Database 最重要特性。数据库的 GUI 工具有很多，IntelliJ IDEA 的 Database 也没有太明显的优势。IntelliJ IDEA 的 Database 最大特性就是对于 Java Web 项目来讲，常使用的 ORM 框架，如 Hibernate、Mybatis 有很好的支持，比如配置好了 Database 之后，IntelliJ IDEA 会自动识别 domain 对象与数据表的关系，也可以通过 Database 的数据表直接生成 domain 对象等。</p></blockquote><h2 id="_2-数据库图标" tabindex="-1">2 数据库图标 <a class="header-anchor" href="#_2-数据库图标" aria-label="Permalink to &quot;2 数据库图标&quot;">​</a></h2><p>图标1：同步当前的数据库连接。这个是最重要的操作。配置好连接以后或通过其他工具操作数据库以后，需要同步</p><p>图标2：配置当前的连接</p><p>图标3：断开当前的连接</p><p>图标4：显示相应数据库对象的数据</p><p>图标5：编辑修改当前数据库对象</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231750262.png" alt="image-20221123175047128" style="zoom:80%;"><h2 id="_3-展示er图" tabindex="-1">3 展示ER图 <a class="header-anchor" href="#_3-展示er图" aria-label="Permalink to &quot;3 展示ER图&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231751693.png" alt="image-20221123175131597" style="zoom:80%;"><p>可以导出文件</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211231751183.png" alt="image-20221123175155084" style="zoom:80%;"><h2 id="_4-数据库操作" tabindex="-1">4 数据库操作 <a class="header-anchor" href="#_4-数据库操作" aria-label="Permalink to &quot;4 数据库操作&quot;">​</a></h2><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241516872.png" alt="image-20221124151610784" style="zoom:80%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2022.12.30/202211241516218.png" alt="image-20221124151651136" style="zoom:80%;"><h1 id="idea看代码高效率⭐" tabindex="-1">IDEA看代码高效率⭐ <a class="header-anchor" href="#idea看代码高效率⭐" aria-label="Permalink to &quot;IDEA看代码高效率⭐&quot;">​</a></h1><h2 id="基本操作-1" tabindex="-1">基本操作 <a class="header-anchor" href="#基本操作-1" aria-label="Permalink to &quot;基本操作&quot;">​</a></h2><p>这一部分的内容主要是一些我平时看源码的时候常用的快捷键/小技巧！非常好用！</p><p>掌握这些快捷键/小技巧，看源码的效率提升一个等级！</p><h3 id="查看当前类的层次结构" tabindex="-1">查看当前类的层次结构 <a class="header-anchor" href="#查看当前类的层次结构" aria-label="Permalink to &quot;查看当前类的层次结构&quot;">​</a></h3><table><thead><tr><th style="text-align:left;">使用频率</th><th style="text-align:left;">相关快捷键</th></tr></thead><tbody><tr><td style="text-align:left;">⭐⭐⭐⭐⭐</td><td style="text-align:left;"><code>Ctrl + H</code></td></tr></tbody></table><p>平时，我们阅读源码的时候，经常需要查看类的层次结构。就比如我们遇到抽象类或者接口的时候，经常需要查看其被哪些类实现。</p><p>拿 Spring 源码为例，<code>BeanDefinition</code> 是一个关于 Bean 属性/定义的接口。</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {</span></span>
<span class="line"><span style="color:#A6ACCD;">  ......</span></span>
<span class="line"><span style="color:#A6ACCD;">}</span></span></code></pre></div><p>如果我们需要查看 <code>BeanDefinition</code> 被哪些类实现的话，只需要把鼠标移动到 <code>BeanDefinition</code> 类名上，然后使用快捷键 <code>Ctrl + H</code> 即可。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XIprzChqHwIId6G0DEh6ib46kO3VD1Vqwia7ibpCpEhzC415QpTFma3RrLQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>同理，如果你想查看接口 <code>BeanDefinition</code> 继承的接口 <code>AttributeAccessor</code> 被哪些类实现的话，只需要把鼠标移动到 <code>AttributeAccessor</code> 类名上，然后使用快捷键 <code>Ctrl + H</code> 即可。</p><h3 id="查看类结构" tabindex="-1">查看类结构 <a class="header-anchor" href="#查看类结构" aria-label="Permalink to &quot;查看类结构&quot;">​</a></h3><table><thead><tr><th style="text-align:left;">使用频率</th><th style="text-align:left;">相关快捷键</th></tr></thead><tbody><tr><td style="text-align:left;">⭐⭐⭐⭐</td><td style="text-align:left;"><code>Alt + 7</code>(Win) / <code>Command +7</code> （Mac）</td></tr></tbody></table><p>类结构可以让我们快速了解到当前类的方法、变量/常量，非常使用！</p><p>我们在对应的类的任意位置使用快捷键 <code>Alt + 7</code>(Win) / <code>Command +7</code> （Mac）即可。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XItrEOt7yUOZicZXNXAjeFyrTbhCtoL1vh1pYhRwRcswYBXehMhHVuSzg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h3 id="快速检索类" tabindex="-1">快速检索类 <a class="header-anchor" href="#快速检索类" aria-label="Permalink to &quot;快速检索类&quot;">​</a></h3><table><thead><tr><th style="text-align:left;">使用频率</th><th style="text-align:left;">相关快捷键</th></tr></thead><tbody><tr><td style="text-align:left;">⭐⭐⭐⭐⭐</td><td style="text-align:left;"><code>Ctrl + N</code> (Win) / <code>Command + O</code> （Mac）</td></tr></tbody></table><p>使用快捷键 <code>Ctrl + N</code> (Win) / <code>Command + O</code> （Mac）可以快速检索类/文件。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XIuj6uwa8kgwogK2p8E4rV5BY0Nrn9fkic4za9wLwpjsnDJiagucHcRsGw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h3 id="关键字检索" tabindex="-1">关键字检索 <a class="header-anchor" href="#关键字检索" aria-label="Permalink to &quot;关键字检索&quot;">​</a></h3><table><thead><tr><th style="text-align:left;">使用频率</th><th style="text-align:left;">相关快捷键</th></tr></thead><tbody><tr><td style="text-align:left;">⭐⭐⭐⭐⭐</td><td style="text-align:left;">见下文</td></tr></tbody></table><ul><li>当前文件下检索 ：<code>Ctrl + F</code> (Win) / <code>Command + F</code> （Mac）</li><li>全局的文本检索 : <code>Ctrl + Shift + F</code> (Win) / <code>Command + Shift + F</code> （Mac）</li></ul><h3 id="查看方法-类的实现类" tabindex="-1">查看方法/类的实现类 <a class="header-anchor" href="#查看方法-类的实现类" aria-label="Permalink to &quot;查看方法/类的实现类&quot;">​</a></h3><table><thead><tr><th style="text-align:left;">使用频率</th><th style="text-align:left;">相关快捷键</th></tr></thead><tbody><tr><td style="text-align:left;">⭐⭐⭐⭐</td><td style="text-align:left;"><code>Ctrl + Alt + B</code> (Win) / <code>Command + Alt + B</code> (Mac)</td></tr></tbody></table><p>如果我们想直接跳转到某个方法/类的实现类，直接在方法名或者类名上使用快捷键 <code>Ctrl + Alt + B/鼠标左键</code> (Win) / <code>Command + Alt + B/鼠标左键</code> (Mac) 即可。</p><p>如果对应的方法/类只有一个实现类的话，会直接跳转到对应的实现类。</p><p>比如 <code>BeanDefinition</code> 接口的 <code>getBeanClassName()</code> 方法只被 <code>AbstractBeanDefinition</code> 抽象类实现，我们对这个方法使用快捷键就可以直接跳转到 <code>AbstractBeanDefinition</code> 抽象类中对应的实现方法。</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {</span></span>
<span class="line"><span style="color:#A6ACCD;">  @Nullable</span></span>
<span class="line"><span style="color:#A6ACCD;"> String getBeanClassName();</span></span>
<span class="line"><span style="color:#A6ACCD;">  ......</span></span>
<span class="line"><span style="color:#A6ACCD;">}</span></span></code></pre></div><p>如果对应的方法/类有多个实现类的话，IDEA 会弹出一个选择框让你选择。</p><p>比如 <code>BeanDefinition</code> 接口的 <code>getParentName()</code> 方法就有多个不同的实现。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XI1icDTgjaVgtbDGJKSkAOicApCBwdgvfaY0oxiaQzW0kdqiaH1I5g1kj3NQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h3 id="查看方法被使用的情况" tabindex="-1">查看方法被使用的情况 <a class="header-anchor" href="#查看方法被使用的情况" aria-label="Permalink to &quot;查看方法被使用的情况&quot;">​</a></h3><table><thead><tr><th style="text-align:left;">使用频率</th><th style="text-align:left;">相关快捷键</th></tr></thead><tbody><tr><td style="text-align:left;">⭐⭐⭐⭐</td><td style="text-align:left;"><code>Alt + F7</code></td></tr></tbody></table><p>我们可以通过直接在方法名上使用快捷键 <code>Alt + F7</code> 来查看这个方法在哪些地方被调用过。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XIbDUBG9DBwZqiaicamtWBPPGDNiaNIJGNPs1XUztR3OWYLyNHQB4ULtMoA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h3 id="查看最近使用的文件" tabindex="-1">查看最近使用的文件 <a class="header-anchor" href="#查看最近使用的文件" aria-label="Permalink to &quot;查看最近使用的文件&quot;">​</a></h3><table><thead><tr><th style="text-align:left;">使用频率</th><th style="text-align:left;">相关快捷键</th></tr></thead><tbody><tr><td style="text-align:left;">⭐⭐⭐⭐⭐</td><td style="text-align:left;"><code>Ctrl + E</code>(Win) / <code>Command +E</code> （Mac）</td></tr></tbody></table><p>你可以通过快捷键 <code>Ctrl + E</code>(Win) / <code>Command +E</code> （Mac）来显示 IDEA 最近使用的一些文件。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XI9ibFODMNugJ8BSgVg4iaiaALERI4d4CQUAaju2ia6B78yichibuiaDwK8ibViaA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h3 id="查看图表形式的类继承链" tabindex="-1">查看图表形式的类继承链 <a class="header-anchor" href="#查看图表形式的类继承链" aria-label="Permalink to &quot;查看图表形式的类继承链&quot;">​</a></h3><table><thead><tr><th style="text-align:left;">使用频率</th><th style="text-align:left;">相关快捷键</th></tr></thead><tbody><tr><td style="text-align:left;">⭐⭐⭐⭐</td><td style="text-align:left;">相关快捷键较多，不建议记</td></tr></tbody></table><p>点击类名 <strong>右键</strong> ，选择 <strong>Shw Diagrams</strong> 即可查看图表形式的类继承链。</p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XIAcYgxXEFichuU5ACnG26m5t1dRVeXZbBvALXOhaeiaLer61k8QZtjaQg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片" style="zoom:67%;"><p>你还可以对图表进行一些操作。比如，你可以点击图表中具体的类 <strong>右键</strong>，然后选择显示它的实现类或者父类。</p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XIibBbe6QQDGXEs2Ap77dAGcSttTLNKEhbDwtMmc1P1IRtbFibwPaAU7HA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片" style="zoom:67%;"><p>再比如你还可以选择是否显示类中的属性、方法、内部类等等信息。</p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XIpQtIon8Jicgjj8KDsDjf9TgXRDeYRfLJcr0icXJS0cfgY3yp4MqN66Aw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片" style="zoom:67%;"><p>如果你想跳转到对应类的源码的话，直接点击图表中具体的类 <strong>右键</strong> ，然后选择 <strong>Jump to Source</strong> 。</p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XIQldrEjvdGiafib5qlJkeRzzUIek2sda2KJG81lPJqlicaibfYdicxiaYs6Qg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片" style="zoom:67%;"><h2 id="插件推荐" tabindex="-1">插件推荐 <a class="header-anchor" href="#插件推荐" aria-label="Permalink to &quot;插件推荐&quot;">​</a></h2><h3 id="一键生成方法的序列图" tabindex="-1">一键生成方法的序列图 <a class="header-anchor" href="#一键生成方法的序列图" aria-label="Permalink to &quot;一键生成方法的序列图&quot;">​</a></h3><p><strong>序列图</strong>（Sequence Diagram），亦称为<strong>循序图</strong>，是一种 UML 行为图。表示系统执行某个方法/操作（如登录操作）时，对象之间的顺序调用关系。</p><p>这个顺序调用关系可以这样理解：你需要执行系统中某个对象 a 提供的方法/操作 login（登录），但是这个对象又依赖了对象 b 提供的方法 getUser(获取用户)。因此，这里就有了 a -&gt; b 调用关系之说。</p><p>我们可以通过 <strong>SequenceDiagram</strong> 这个插件一键生成方法的序列图。</p><blockquote><p>如果你因为网络问题没办法使用 IDEA 自带的插件市场的话，也可以通过 IDEA 插件市场的官网手动下载安装。</p></blockquote><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XIDbqct7ruAFTMgRbKRzMUrf8mDchSJBKhZibWp8GPBemYWTFf3Jo48mw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片" style="zoom:67%;"><p><strong>如何使用呢？</strong></p><p>1、选中方法名（注意不要选类名），然后点击鼠标右键，选择 <strong>Sequence Diagram</strong> 选项即可！</p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XIw1LbL5VTLAeJOPyECSjlxPJKicopHlgVRUR6CTbtS59CNyFuPepO2ag/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片" style="zoom:67%;"><p>2、配置生成的序列图的一些基本的参数比如调用深度之后，我们点击 ok 即可！</p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XIMWknniaLJyuQZ2iap8xjGOJUDG3MnfHufFLy30CdGhmO7DIlrfOsePtw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片" style="zoom:67%;"><p>3、你还可以通过生成的时序图来定位到相关的代码，这对于我们阅读源码的时候尤其有帮助！</p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XIDgo4QCSRjaUjLf8ffIuTkGFjseYEtwq5FcF3icPLU8NvKCNaibh9g8zg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片" style="zoom:67%;"><p>4、时序图生成完成之后，你还可以选择将其导出为图片。</p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XIDJWam1pic8ZrzFAt6L9EZZKPanPSU1SB120o8eicEro4oWlcA0N2wWaQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片" style="zoom:67%;"><p>相关阅读：<a href="https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&amp;mid=2247494507&amp;idx=2&amp;sn=50764e6f24f3f48738770154d032dde4&amp;scene=21#wechat_redirect" target="_blank" rel="noreferrer">《安利一个 IDEA 骚操作:一键生成方法的序列图》</a> 。</p><h3 id="项目代码统计" tabindex="-1">项目代码统计 <a class="header-anchor" href="#项目代码统计" aria-label="Permalink to &quot;项目代码统计&quot;">​</a></h3><p>为了快速分析项目情况，我们可以对项目的 <strong>代码的总行数、单个文件的代码行数、注释行数等信息进行统计。</strong></p><p><strong>Statistic</strong> 这个插件来帮助我们实现这一需求。</p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XIgnH2n2ZoEk2Jnwro7vndgRgFiadD5yNAURjI5Jz8VZ2WdfVjBt31Bow/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片" style="zoom:67%;"><p>有了这个插件之后你可以非常直观地看到你的项目中所有类型的文件的信息比如数量、大小等等，可以帮助你更好地了解你们的项目。</p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XI0nMlxcnTOM7NVbmve8DHELsJvtwMpXTpDvbdvrPzz9ib1TtjlofE0JQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片" style="zoom:67%;"><p>你还可以使用它看所有类的总行数、有效代码行数、注释行数、以及有效代码比重等等这些东西。</p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TynfGvtQZyQB3dAdHjFX5XIWZKmFL9R6UIYcKdpvzl17FraQH12fcibwnX9ib3icUkCP5ia3RO5oiciaSNQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片" style="zoom:67%;"><p>如果你担心插件过多影响 IDEA 速度的话，可以只在有代码统计需求的时候开启这个插件，其他时间禁用它就完事</p><h1 id="idea代码重构技巧⭐" tabindex="-1">IDEA代码重构技巧⭐ <a class="header-anchor" href="#idea代码重构技巧⭐" aria-label="Permalink to &quot;IDEA代码重构技巧⭐&quot;">​</a></h1><h2 id="重构函数" tabindex="-1">重构函数 <a class="header-anchor" href="#重构函数" aria-label="Permalink to &quot;重构函数&quot;">​</a></h2><h3 id="_1、提取方法" tabindex="-1">1、提取方法 <a class="header-anchor" href="#_1、提取方法" aria-label="Permalink to &quot;1、提取方法&quot;">​</a></h3><p>提取想要的代码，按快捷键<code>Ctrl+Alt+M</code>，就会弹出框，写出方法名称即可提取一个方法</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbud2zjuVNCuLhvg7SPH3JLZ83UMK5L9icbTXqdYGVCWFsFercKf4pRlIycUibDY5uXvRJUncKh1pxX6A/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbud2zjuVNCuLhvg7SPH3JLZ8BcuzZHQU2Bj09AH63WqY3MSQBKV766slPvD3LPwNQ3am9eHSoTqubw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h3 id="_2、合并方法" tabindex="-1">2、合并方法 <a class="header-anchor" href="#_2、合并方法" aria-label="Permalink to &quot;2、合并方法&quot;">​</a></h3><p>反向操作，选中方法后，把方法代码直接并入主方法里面</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbud2zjuVNCuLhvg7SPH3JLZ8CtgrVQMphqsBH1huTkzJLDFKS6YMWHdCqgyxh6aiciahgg6ia53OKNPlA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h3 id="_3、方法重命名" tabindex="-1">3、方法重命名 <a class="header-anchor" href="#_3、方法重命名" aria-label="Permalink to &quot;3、方法重命名&quot;">​</a></h3><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">Ctrl+Shift+Alt+T`，或者`Shift+F6</span></span></code></pre></div><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbud2zjuVNCuLhvg7SPH3JLZ8TKU7LTlIjlNjyvX0RvDEhlY8BgRrIdvwibthywaQDWNkhNxn5ReJmIQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbud2zjuVNCuLhvg7SPH3JLZ83bpAMmVxV6rBdejRcFQe9qu8p4gibqKKky71UlrWMBZwlrxtIzYiaPTQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h3 id="_4、函数参数位置更改与重命名" tabindex="-1">4、函数参数位置更改与重命名 <a class="header-anchor" href="#_4、函数参数位置更改与重命名" aria-label="Permalink to &quot;4、函数参数位置更改与重命名&quot;">​</a></h3><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbud2zjuVNCuLhvg7SPH3JLZ8LWjbGT8ibfibOjbPOTicutm679juf7KmAe474X5wvcyjMZtia3kzshae4A/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbud2zjuVNCuLhvg7SPH3JLZ89gHbh9DiciboWU8ywIsXplnyTdUlYNKWfAV2lJ569fg4AuRcebk35P8A/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h2 id="重构变量" tabindex="-1">重构变量 <a class="header-anchor" href="#重构变量" aria-label="Permalink to &quot;重构变量&quot;">​</a></h2><ul><li><code>Ctrl+Alt+C</code> 快速提取常量（Constant）</li><li><code>Ctrl+Alt+V</code>快速提取变量（Variable）</li><li><code>Ctrl+Alt+F</code>快速提取成员变量（Filed Variable）</li><li><code>Ctrl+Shift+f6</code> 重构变量的类型</li></ul><p>点击变量，直接使用快捷键</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbud2zjuVNCuLhvg7SPH3JLZ8tC3BFuE9Y9iaX9ymYyyjgHGPeE6UEjd6EWAZVqqEQ9rk7haFWktLEIg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbud2zjuVNCuLhvg7SPH3JLZ8tCuiaxfxSSgzl7ic7eguKGSGYzEvLY2MkcUeGuTjsiayBIDqI8hUyq9yw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h2 id="提取方法到父类" tabindex="-1">提取方法到父类 <a class="header-anchor" href="#提取方法到父类" aria-label="Permalink to &quot;提取方法到父类&quot;">​</a></h2><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbud2zjuVNCuLhvg7SPH3JLZ8picCvSGLQXiaf2E9HhRzZU9BDnpyfwtCAYf7JsyR996EpGfeWBCjS9jg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbud2zjuVNCuLhvg7SPH3JLZ8rxJzXQAy7MINicufUKKibLEdbzD1yLOseRKIeHTqtxMXASib5FjdINhaQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbud2zjuVNCuLhvg7SPH3JLZ8oP1FOyz9k5etTPYDqCZXrXm0FtpTbMR2HCSQP6MhDQx9hIavtZ3YSQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h1 id="idea-性能优化设置" tabindex="-1">IDEA 性能优化设置 <a class="header-anchor" href="#idea-性能优化设置" aria-label="Permalink to &quot;IDEA 性能优化设置&quot;">​</a></h1><blockquote><p>在我们日常使用IDEA进行开发时，可能会遇到许多卡顿的瞬间，明明我们的机器配置也不低啊？为什么就会一直卡顿呢？原来这是因为IDEA软件在我们安装的时候就设置了默认的内存使用上限（通常很小），这就是造成我们使用IDEA时卡顿的根本原因。</p></blockquote><blockquote><p>比如我这台电脑，明明是16GB的运行内存，但是IDEA默认给我分配的使用上限是1GB，当我运行大量代码时自然而然的就会产生卡顿。</p></blockquote><h2 id="查看项目占用内存大小" tabindex="-1">查看项目占用内存大小 <a class="header-anchor" href="#查看项目占用内存大小" aria-label="Permalink to &quot;查看项目占用内存大小&quot;">​</a></h2><p>我们可以通过显示内存使用情况来查看当前项目占用的内存大小。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303061010171.png" alt="image-20230306101005054" style="zoom:67%;"><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303061010288.png" alt="image-20230306101024151" style="zoom:67%;"><blockquote><p>可以看到当前我的程序占用了690MB的内存，而上限是1024MB（在性能突发时完全承受不住）。我们可以通过进入IDEA的设置来更改这些配置。</p></blockquote><h2 id="自定义虚拟机内存" tabindex="-1">自定义虚拟机内存 <a class="header-anchor" href="#自定义虚拟机内存" aria-label="Permalink to &quot;自定义虚拟机内存&quot;">​</a></h2><p><strong>1.选择顶部导航栏中的Help，然后点击<code>Edit Custom VM Options</code>（自定义虚拟机内存）。</strong></p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303061011159.png" alt="image-20230306101111059" style="zoom:67%;"><p><strong>2.接下来我们将会看到这个界面：</strong></p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">-Xmx1024m    // 最大内存上限为：1024MB（1GB）</span></span>
<span class="line"><span style="color:#A6ACCD;">-Xms256m     // 初始内存分配大小为：256MB</span></span>
<span class="line"><span style="color:#A6ACCD;">-XX:ReservedCodeCacheSize=128m    //代码缓冲区大小：128MB</span></span>
<span class="line"><span style="color:#A6ACCD;">-XX:+UseG1GC</span></span></code></pre></div><p>我们对其进行适当的修改（具体根据个人电脑配置），并保存文件：</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">-Xmx4096m</span></span>
<span class="line"><span style="color:#A6ACCD;">-Xms4096m</span></span>
<span class="line"><span style="color:#A6ACCD;">-XX:ReservedCodeCacheSize=256m</span></span>
<span class="line"><span style="color:#A6ACCD;">-XX:+UseG1GC</span></span></code></pre></div><p><strong>3. 缓存清理（使新配置生效）：</strong></p><p>选择 <code>File ---&gt; Invalidate Caches</code>（清理无效的缓存）</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303061011684.png" alt="image-20230306101131564" style="zoom:67%;"><p>保持默认的选项，选择确定清理缓存并重启IDEA （结束）。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303061011171.png" alt="image-20230306101151058" style="zoom:67%;"><p>好了，最后我们来看一下重启之后的IDEA效果~没错，很流畅</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202303061012132.png" alt="image-20230306101230959" style="zoom:67%;"><h2 id="详细参数" tabindex="-1">详细参数 <a class="header-anchor" href="#详细参数" aria-label="Permalink to &quot;详细参数&quot;">​</a></h2><p>另外说一句，JetBrains系列的产品都可以通过这种设置来解决卡顿的问题。没错，包括PyCharm、Android Studio、WebStorm等，其余参数说明如下：参数说明：</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">-server:一定要作为第一个参数，在多个CPU时性能佳</span></span>
<span class="line"><span style="color:#A6ACCD;">-Xms：初始Heap大小，使用的最小内存,cpu性能高时此值应设的大一些</span></span>
<span class="line"><span style="color:#A6ACCD;">-Xmx：java heap最大值，使用的最大内存</span></span>
<span class="line"><span style="color:#A6ACCD;">-XX:PermSize:设定内存的永久保存区域</span></span>
<span class="line"><span style="color:#A6ACCD;">-XX:MaxPermSize:设定最大内存的永久保存区域</span></span>
<span class="line"><span style="color:#A6ACCD;">-XX:MaxNewSize:</span></span>
<span class="line"><span style="color:#A6ACCD;">+XX:AggressiveHeap 使 Xms 失去意义。</span></span>
<span class="line"><span style="color:#A6ACCD;">-Xss：每个线程的Stack大小</span></span>
<span class="line"><span style="color:#A6ACCD;">-verbose:gc 现实垃圾收集信息</span></span>
<span class="line"><span style="color:#A6ACCD;">-Xloggc:gc.log 指定垃圾收集日志文件</span></span>
<span class="line"><span style="color:#A6ACCD;">-Xmn：young generation的heap大小，一般设置为Xmx的3、4分之一</span></span>
<span class="line"><span style="color:#A6ACCD;">-XX:+UseParNewGC ：缩短minor收集的时间</span></span>
<span class="line"><span style="color:#A6ACCD;">-XX:+UseConcMarkSweepGC ：缩短major收集的时间</span></span></code></pre></div><p>提示：此选项在Heap Size 比较大而且Major收集时间较长的情况下使用更合适。</p><h1 id="其他小技巧" tabindex="-1">其他小技巧 <a class="header-anchor" href="#其他小技巧" aria-label="Permalink to &quot;其他小技巧&quot;">​</a></h1><h2 id="我最爱的【演出模式】" tabindex="-1">我最爱的【演出模式】 <a class="header-anchor" href="#我最爱的【演出模式】" aria-label="Permalink to &quot;我最爱的【演出模式】&quot;">​</a></h2><p>我们可以使用【Presentation Mode】，将<code>IDEA</code>弄到最大，可以让你只关注一个类里面的代码，进行毫无干扰的<code>coding</code>。可以使用<code>Alt+V</code>快捷键，弹出<code>View</code>视图，然后选择<code>Enter Presentation Mode</code>。效果如下： <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouicAC1S1v91vNibKl1TRyk5Mmxic2m0oQqxglrrRxTqKLzm3FVxuOoJ1bw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>这个模式的好处就是，可以让你更加专注，因为你只能看到特定某个类的代码。可能读者会问，进入这个模式后，我想看其他类的代码怎么办？这个时候，就要考验你快捷键的熟练程度了。你可以使用<code>CTRL+E</code>弹出最近使用的文件。又或者使用<code>CTRL+N</code>和<code>CTRL+SHIFT+N</code>定位文件。</p><p>如何退出这个模式呢？很简单，使用<code>ALT+V</code>弹出view视图，然后选择<code>Exit Presentation Mode</code> 即可。但是我强烈建议你不要这么做，因为你是可以在<code>Enter Presentation Mode</code>模式下在<code>IDEA</code>里面做任何事情的。当然前提是，你对<code>IDEA</code>足够熟练。</p><hr><h2 id="神奇的inject-language" tabindex="-1">神奇的Inject language <a class="header-anchor" href="#神奇的inject-language" aria-label="Permalink to &quot;神奇的Inject language&quot;">​</a></h2><p>如果你使用<code>IDEA</code>在编写<code>JSON</code>字符串的时候，然后要一个一个<code>\</code>去转义双引号的话，就实在太不应该了，又烦又容易出错。在<code>IDEA</code>可以使用<code>Inject language</code>帮我们自动转义双引号。 <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouhx1YX3IvZIb7iawSXQe4X1GE3kh7AFss1o0pht4K03EdUNzakGvyWCw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>先将焦点定位到双引号里面，使用<code>alt+enter</code>快捷键弹出<code>inject language</code>视图，并选中 <code>Inject language or reference</code>。 <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaoujs0OcOqRJ4vARhC1MlMkHx1bT4Gw2AfJZFV1rRDZtSlDSFvyJI8XaA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>选择后,切记，要直接按下<code>enter</code>回车键，才能弹出<code>inject language</code>列表。在列表中选择 <code>json</code>组件。 <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaou5ZHHnLibCsEo6cTtyY9sZicVhYBNwvsyqWe98BnMUic05k7gc4VJToKdw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>选择完后。鼠标焦点自动会定位在双引号里面，这个时候你再次使用<code>alt+enter</code>就可以看到 <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouF9ymMlhWxzfOrsPyNic0CriclHL09yPUwJbXyrrWjkeEJicdSVSCrSSVg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>选中<code>Edit JSON Fragment</code>并回车，就可以看到编辑<code>JSON</code>文件的视图了。 <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouaAxfEv9CATNiboLnXpEStnoFPBuY6jdMicy2Al1PT6FxAVYMvVsFQVJQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>可以看到<code>IDEA</code>确实帮我们自动转义双引号了。如果要退出编辑<code>JSON</code>信息的视图，只需要使用<code>ctrl+F4</code>快捷键即可。</p><p><code>Inject language</code>可以支持的语言和操作多到你难以想象，读者可以自行研究。</p><hr><h2 id="使用快捷键移动分割线" tabindex="-1">使用快捷键移动分割线 <a class="header-anchor" href="#使用快捷键移动分割线" aria-label="Permalink to &quot;使用快捷键移动分割线&quot;">​</a></h2><p>假设有下面的场景，某个类的名字在<code>project</code>视图里被挡住了某一部分。 <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouKr2YHGSboCyGG0U06XVECtN3MsRX05DDx1DnlK9yJqKmymicdeaSEqA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>你想完整的看到类的名字，该怎么做。一般都是使用鼠标来移动分割线，但是这样子效率太低了。可以使用<code>alt+1</code>把鼠标焦点定位到<code>project</code>视图里，然后直接使用<code>ctrl+shift+左右箭头</code>来移动分割线。</p><hr><hr><h2 id="不要动不动就使用idea的重构功能" tabindex="-1">不要动不动就使用IDEA的重构功能 <a class="header-anchor" href="#不要动不动就使用idea的重构功能" aria-label="Permalink to &quot;不要动不动就使用IDEA的重构功能&quot;">​</a></h2><p><code>IDEA</code>的重构功能非常强大，但是也有时候，在单个类里面，如果只是想批量修改某个文本，大可不必使用到重构的功能。比如说： <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaou1NpuFqYFzpwzzaE7lhPvYY3uNibkdfP2tEicjrDw4WMMibfXIQnYYRsHA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>上面的代码中，有5个地方用到了rabbitTemplate文本，如何批量修改呢？ 首先是使用<code>ctrl+w</code>选中<code>rabbitTemplate</code>这个文本,然后依次使用5次<code>alt+j</code>快捷键，逐个选中，这样五个文本就都被选中并且高亮起来了，这个时候就可以直接批量修改了。 <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouJR4LxgLF8OCjKTSoTII9pu8yfFPuUric7A8slBibYMm3PnrynLJS20MQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h2 id="把鼠标定位到project视图里" tabindex="-1">把鼠标定位到project视图里 <a class="header-anchor" href="#把鼠标定位到project视图里" aria-label="Permalink to &quot;把鼠标定位到project视图里&quot;">​</a></h2><p>当工程里的包和类非常多的时候，有时候我们想知道当前类在project视图里是处在哪个位置。 <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouLIia70ffezVNw2tqtvGIVl2KAkA1F7tJw3EZINkrMcKsA3AOF6kTSJQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>上面图中的<code>DemoIDEA</code>里，你如何知道它是在<code>spring-cloud-config</code>工程里的哪个位置呢？ 可以先使用<code>alt+F1</code>，弹出<code>Select in</code>视图，然后选择<code>Project View</code>中的<code>Project</code>，回车，就可以立刻定位到类的位置了。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouwJMWYxCDrLoTwOVD08DzWEFkDpgnuSic5wx29KGNzlGGiaRQ9SyjJaYA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">这里写图片描述</p><p>那如何从<code>project</code>跳回代码里呢？可以直接使用<code>esc</code>退出<code>project</code>视图，或者直接使用<code>F4</code>,跳到代码里。</p><hr><h2 id="强大的symbol" tabindex="-1">强大的symbol <a class="header-anchor" href="#强大的symbol" aria-label="Permalink to &quot;强大的symbol&quot;">​</a></h2><p>如果你依稀记得某个方法名字几个字母，想在<code>IDEA</code>里面找出来，可以怎么做呢？ 直接使用<code>ctrl+shift+alt+n</code>，使用<code>symbol</code>来查找即可。 比如说： <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouLiaPpMyzLlYZtjvlWHB5ZcJzXWj7kPHKm5Q5GKicQnzP0CQhZIUJDENg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>你想找到checkUser方法。直接输入<code>user</code>即可。 <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouvzicHe9nkkG98TJKAUyYVJMR4LfoNOFoOwvSNdpCibooKibDgTiaiayjHsQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>如果你记得某个业务类里面有某个方法，那也可以使用首字母找到类,然后加个<code>.</code>，再输入方法名字也是可以的。 <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouYiaVr8j30o8YAmdI88HeKA1jXVplExiavxdIypD6AvZtEUaU0icpHnGOg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><hr><h2 id="如何找目录" tabindex="-1">如何找目录 <a class="header-anchor" href="#如何找目录" aria-label="Permalink to &quot;如何找目录&quot;">​</a></h2><p>使用<code>ctrl+shift+n</code>后，使用<code>/</code>，然后输入目录名字即可. <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouk3motdy7cn4FC2biaDcr3Hfic4hcVeNudwv8OadXc8K6dgvnQnn9l3ibQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h2 id="按照模板找内容" tabindex="-1">按照模板找内容 <a class="header-anchor" href="#按照模板找内容" aria-label="Permalink to &quot;按照模板找内容&quot;">​</a></h2><p>这个也是我非常喜欢的一个功能，可以根据模板来找到与模板匹配的代码块。比如说：</p><blockquote><p>想在整个工程里面找到所有的try catch语句,但是catch语句里面没有做异常处理的。</p></blockquote><p>catch语句里没有处理异常，是极其危险的。我们可以<code>IDEA</code>里面方便找到所有这样的代码。 <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouGMmQcbgrZtUR4vpfX3DHo0CtRPwM5XWmlQ9FenEZOjFuDYMgqT22AA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>首先使用<code>ctrl+shift+A</code>快捷键弹出action框，然后输入<code>Search Struct</code><img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouPiaME7phsePM8WLeCTRPQiaDorHzIfEqR36fFhEibegMZJf9dpOlDVQPA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>选择<code>Search Structurally</code>后，回车，跳转到模板视图。 <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaou4MLFxCQ2l17amxIic34aUX91kTQItSUDIgoyAmJZaRYZ0OBen6738kg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>点击<code>Existing Templates</code>按钮，选择<code>try</code>模板。为了能找出catch里面没有处理异常的代码块，我们需要配置一下<code>CatchStatement</code>的<code>Maximum count</code>的值，将其设置为1。</p><p>点击<code>Edit Variables</code>按钮，在界面修改<code>Maximum count</code>的值。 <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouKQbEUxIMDc1ibF61OlLNiceAoxcfUv2WEFJ1egs7OQuMP64jghs7zhqw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>最后点击<code>find</code>按钮，就可以找出catch里面没有处理异常的代码了。 <img src="https://mmbiz.qpic.cn/mmbiz_png/eQPyBffYbuc64ibKlVeda4KyHwkfsWaouMOoU3qrSzSQo4O2zWSkyWVxL7B0zv47FyUONp9ltqA0vffeZESibvibg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h1 id="datagrip" tabindex="-1">DataGrip <a class="header-anchor" href="#datagrip" aria-label="Permalink to &quot;DataGrip&quot;">​</a></h1><p>DataGrip 是由 JetBrains 公司（就是那个出品 Intellij IDEA 的公司,JetBrains出品，必属精品）推出的数据库管理软件。如果你不爱折腾的话，这家公司出品的很多 IDE 都是你的最佳选择，比如你进行 Python 开发的可以选择 JetBrains 全家桶中的 PyCharm 。</p><p><strong>DataGrip 支持几乎所有主流的关系数据库产品，如 DB2、Derby、H2、MySQL、Oracle、PostgreSQL、SQL Server、Sqllite 及 Sybase 等，并且提供了简单易用的界面，开发者上手几乎不会遇到任何困难。</strong></p><p>我相信，当你第一眼看到 DataGrip 以后，会有一种惊艳的感觉，就好比你第一眼看到一个姑娘，就是那么一瞥，你对自己说，就是她了！</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TydrqornfKia1R3ibaZ6icvTN66ib1JCFbgrKMMhuaaMuT9yKoXNVo1RsGvwKrwK5CgUKgUsq1CyREAIw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>废话不多说，来看看 DataGrip 的常用功能。</p><h2 id="下载" tabindex="-1">下载 <a class="header-anchor" href="#下载" aria-label="Permalink to &quot;下载&quot;">​</a></h2><p>DataGrip 下载链接如下 <a href="https://www.jetbrains.com/datagrip/download%E3%80%82%E5%AE%89%E8%A3%85%E8%BF%87%E7%A8%8B%E4%B9%9F%E5%BE%88%E7%AE%80%E5%8D%95%EF%BC%8C%E5%8F%8C%E5%87%BB%E5%AE%89%E8%A3%85%EF%BC%8C%E4%B8%8B%E4%B8%80%E6%AD%A5%EF%BC%8C%E4%B8%AD%E9%97%B4%E4%BC%9A%E8%AE%A9%E4%BD%A0%E9%80%89%E6%8B%A9%E4%B8%BB%E9%A2%98%EF%BC%8C%E6%9C%AC%E4%BA%BA%E9%80%89%E6%8B%A9%E7%9A%84%E6%98%AF%E7%BB%8F%E5%85%B8%E7%9A%84" target="_blank" rel="noreferrer">https://www.jetbrains.com/datagrip/download。安装过程也很简单，双击安装，下一步，中间会让你选择主题，本人选择的是经典的</a> Darcula，安装完成后，启动，界面如下</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5CdYZwUIhxhPCEicV7FKryhYGkgRg1n7XXReUw4FOSzbCWoVQC0cuGuQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>如果你使用的是 IDEA 的话，内置的数据库管理我觉得基本就够用了，不需要再重新下载PJ <strong>DataGrip</strong>了。</p><h2 id="配置-data-source" tabindex="-1">配置 Data Source <a class="header-anchor" href="#配置-data-source" aria-label="Permalink to &quot;配置 Data Source&quot;">​</a></h2><p>相信使用过 IDEA 的同学看到这个界面都会感到很亲切。<code>File-&gt;DataSource</code> ：配置数据源。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5xI8jicKJJGWIH65GQlqZibKVzzcX2AsguWNiaKrQ19icXXtDJ2lLiculcpQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">DataGrip 支持主流的数据库。你也可以在 Database 视图中展开绿色的+号，添加数据库连接</p><p><img src="https://mmbiz.qpic.cn/mmbiz_jpg/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5qN1huNf9hATvwrTqVZG5YTibygGMSibYsDk95OAxtV76JRZibw51dzbbQ/640?wx_fmt=jpeg&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">选择需要连接的数据库类型</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5XYmOoR4wfxctHeq1X5mZEPnYRcCjmVN39ZQXQsdRK3z7icvAnibiaW09g/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>在面板中，左上部分列出了已经建立的数据库连接，点击各项，右侧会展示当前连接的配置信息，General 面板中，可以配置数据库连接的信息，如主机、用户名、密码等，不同数据库配置信息不完全相同，填入数据库 URL，注意，URL 后有个选项，可以选择直接填入 url，那么就不需要单独填主机名、端口等信息了。</p><p>Driver 部分显示数据库驱动信息，如果还没有下载过驱动，底部会有个警告，提示缺少驱动</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5HlJZn0nTN8BZ3s8xxqiblL5FQzqe21ARiaD17lvfM5ibSicJ4RE546duGA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">点击 Driver 后的数据库类型，会跳转到驱动下载页面，点击 download，下载完会显示驱动包</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5GeU1ibO0MYaSNHHFzDToM9GGGBGSjdniczyiaGGicNf3W8ct21xVwGnS0w/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd58K9ZEJgZ3IgcpuiazvRSj91pHmubfy7VYFFmVzBCichUp3iaXTbyzHdCQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">如果下载的驱动有问题，可以手动添加本地驱动包，在试用过程中，创建 Oracle 连接时，下载的驱动包就有问题，提示缺少 class，点击右侧绿色的+号，选择本地下载好的 jar 包，通过右侧上下箭头，将导入的 jar 包移到最上位置就 OK 了</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5xDjjfm8yxHG0EFcBlYAE9ThstYwGibQKDQkoaf4iaAmiaTyjEq5tZSIBw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>点击 Test Connection，查看配置是否正确，接下来就可以使用了。</p><h2 id="常用设置" tabindex="-1">常用设置 <a class="header-anchor" href="#常用设置" aria-label="Permalink to &quot;常用设置&quot;">​</a></h2><p>打开 DataGrip，选择 <code>File-&gt;Settings</code>，当前面板显示了常用设置项</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5ZVDib3mfiarqx7G2fbVCDCn4t4ibrwv02TcAnSWCiaS0w7W6BwzCwyjZhA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">基本上默认设置就足够了，要更改设置也很简单，左侧菜单已经分类好了，第一项是数据库相关的配置，第二项是配置外观的，在这里可以修改主题，key map 修改快捷键，editor 配置编辑器相关设置，在这里可以修改编辑器字体，展开 edit 项: <code>Editor-&gt;Color &amp; Fonts-&gt;Font</code></p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5icaYZoeLoAibicF8zfoU8cvJupzzfV6NXaYnmIcgjFeJgVxu6mqWqJnVw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">需要将当前主题保存一下，点击 save as，起个名，选择重命名后的主题就能修改了，这里我选择习惯的 Conurier New 字体，大小为 14 号，点击右下角的 apply，点击 OK</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5S9CFnL96UciaHRJ7bU505hHoxs6NqRs6hhibnibdUfic2OqjZMabkCMbgA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">点击查看原始大小图片</p><p>其他的没啥好设置的了。</p><h2 id="数据库常用操作" tabindex="-1">数据库常用操作 <a class="header-anchor" href="#数据库常用操作" aria-label="Permalink to &quot;数据库常用操作&quot;">​</a></h2><p>接下来，我们来使用 DataGrip 完成数据库的常用操作，包括查询数据、修改数据，创建数据库、表等。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5icbHGVw1Q3Eg8mYXEwgZRgjntyWLvC8uwX85sFVRkpc0IENFWmiayffg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">左上区域显示了当前数据库连接，展开后会显示数据库表等信息，如果展开后没有任何信息，需要选中数据库连接，点击上面的旋转图标同步一下，下方有个 More Schema 选项，点击可以切换不同的 schema。</p><h3 id="sql-语句编写" tabindex="-1">sql 语句编写 <a class="header-anchor" href="#sql-语句编写" aria-label="Permalink to &quot;sql 语句编写&quot;">​</a></h3><p>右键选中的数据库连接，选择 open console，就可以在右侧的控制台中书写 sql 语句了。</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5LibcXGL2qnU66IqqGJyzsX8ArpCIY8uHWiaIT2056vsiabaSk6jViaZLOQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>** DataGrip 的智能提示非常爽，无论是标准的 sql 关键字，还是表名、字段名，甚至数据库特定的字段，都能提示，不得不感叹这智能提示太强大了，Intellij IDEA 的智能提示也是秒杀 eclipse。**</p><p>写完 sql 语句后，可以选中，电子左上侧绿色箭头执行</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5KJMsOswzaztIVOY2k4dv2ykKssW8n0IpGtibNGAmPyibxUma7ibjOveKA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">也可以使用快捷键 <code>Ctrl+Enter</code>，选中情况下，会直接执行该 sql，未选中情况下，如果控制台中有多条 sql，会提示你要执行哪条 sql。</p><p>之前习惯了 dbvisualizer 中的操作，dbvisualizer 中光标停留在当前 sql 上(sql 以分号结尾)，按下<code>Ctrl+.</code>快捷键会自动执行当前 sql，其实 DataGrip 也能设置，在 <code>setting-&gt;Database-General</code>中</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5lGfrLI0lk8icBZmKxOjfGBoJ7mvyalhQolIhdpiaNL6tyycOzdqsBpJQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">语句执行时默认是提示，改成 smallest statement 后，光标停留在当前语句时，按下 Ctrl+Enter 就会直接执行当前语句。</p><p>语句的执行结果在底部显示</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5fNBcnFd5huRH1NuXTsY66RQibrhMEY0E3sIk43hFZUaF30hOibsZM7Pw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">如果某列的宽度太窄，可以鼠标点击该列的任意一个，使用快捷键<code>Ctrl+Shift+左右箭头</code>可以调整宽度，如果要调整所有列的宽度，可以点击左上角红框部分，选择所有行，使用快捷键<code>Ctrl+Shift+左右箭头调整</code></p><h3 id="修改数据" tabindex="-1">修改数据 <a class="header-anchor" href="#修改数据" aria-label="Permalink to &quot;修改数据&quot;">​</a></h3><p>添加行、删除行也很方便，上部的+、-按钮能直接添加行或删除选中的行，编辑列同样也很方便，双击要修改的列，输入修改后的值，鼠标在其他部分点击就完成修改了</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd50uokNJ7tJVrY6WMB6AaCXpM0D9PiawlicMUk4Dyg5WyTUvw30KaUiaf3g/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">有的时候我们要把某个字段置为 null，不是空字符串&quot;&quot;，DataGrip 也提供了渐变的操作，直接在列上右键，选择 set null</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5p65DH7RgiaZ9FhWpI5icic5lIP5XgDxWds7xmwsvUBfoM6vuNW01C75AA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">对于需要多窗口查看结果的，即希望查询结果在新的 tab 中展示，可以点击 pin tab 按钮，那新查询将不会再当前 tab 中展示，而是新打开一个 tab</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5cFdUppiakdq8MdTcibdYqFIlaI4bGolSffcjBT1x9ETlCyKyWtn4j4zQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>旁边的 output 控制台显示了执行 sql 的日志信息，能看到 sql 执行的时间等信息</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5HC8RrhbSicdI1iapdGUYvicC1pacGbmvandb0dOKicN53OEbBztYD4sYicA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">我就问这么吊的工具，还有谁！！！</p><h3 id="新建表" tabindex="-1">新建表 <a class="header-anchor" href="#新建表" aria-label="Permalink to &quot;新建表&quot;">​</a></h3><p>要新建表也是相当简单、智能，选中数据库连接，点击绿色+号下选择 table</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5LxKMd0lRxnKftzxqRlSERZibkM0tFrGoWNH173AWQgQTIlz4LO7C9xA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">在新打开的窗口中，可以填写表信息</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5PGqgH5FgW8uGYA2TySt7hZVrYgvARGEynkAib7Cz4nqGzHz5TZztFKA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">我就问你看到这个窗口兴奋不兴奋！！！</p><p>顶部可以填写表名、表注释，中间可以点击右侧绿色+号添加列，列类型 type 也是能自动补全，default 右侧的消息框图标点击后能对列添加注释，旁边的几个 tab 可以设置索引及外键</p><p>所有这些操作的 DDL 都会直接在底部显示</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5sBtdiakgckRr637j8Wu6Iq8Mc86z1k4gzLJpQegFzWU9QnOOS4RIarw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">我就问你怕不怕</p><p>表建完后，可以点击下图中的 table 图标，打开表查看视图</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5cPoZc78rxGVZ4WUrl6HfVmHeJa3LpzAnG4eYuUohqAYOqiapibTo59SQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">可以查看表的数据，也能查看 DDL 语句</p><h3 id="数据库导出" tabindex="-1">数据库导出 <a class="header-anchor" href="#数据库导出" aria-label="Permalink to &quot;数据库导出&quot;">​</a></h3><p>这些基本功能的设计、体验，已经惊艳到我了，接下来就是数据的导出。</p><p>DataGrip 的导出功能也是相当强大，选择需要导出数据的表，右键，Dump Data To File</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5H01ZKcuicxXViaDnJk0Oia5BbicxrnOTxXtOfFx5N9kMvjlhWQSRUicLtfg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">即可以导出 insert、update 形式的 sql 语句，也能导出为 html、csv、json 格式的数据</p><p>也可以在查询结果视图中导出</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5Xs1UHYFXPiatLjfhkypCY54y7yr4nDwd8hwjYI4vOheG1AQgWAVWu6w/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">点击右上角下载图标，在弹出窗口中可以选择不同的导出方式，如 sql insert、sql update、csv 格式等</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5jskVug7q1v7AjNCEbFicceK9VXtAQKqsXVhBQvV3ftpfjVovtgicSx0Q/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>如果是导出到 csv 格式，还能控制导出的格式</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5hMnw8hXTSX4SEdj1lnPaLUia1mfaKNhFODdTstZJ391f37oqPltoHxA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><p>导出后用 excel 打开是这种结果</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5bzjpuhKkCV0ciaGqAuHc6mqAkYXeR3o2ZxSibUg4l94mevGy80eeibfHg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">除了能导出数据外，还能导入数据</p><p>选择表，右键-&gt;Import from File，选择要导入的文件</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd50NkEIZ4SvzICCTRheIv19LMI6nqjsbiaawPmkWWHn2iaLX3WBs5VeiaDQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">注意，导出的时候如果勾选了左侧的两个 header 选项，导入的时候如果有 header，也要勾选，不然会提示列个数不匹配</p><h2 id="小技巧" tabindex="-1">小技巧 <a class="header-anchor" href="#小技巧" aria-label="Permalink to &quot;小技巧&quot;">​</a></h2><h3 id="导航-全局搜索" tabindex="-1">导航+全局搜索 <a class="header-anchor" href="#导航-全局搜索" aria-label="Permalink to &quot;导航+全局搜索&quot;">​</a></h3><h4 id="关键字导航" tabindex="-1">关键字导航 <a class="header-anchor" href="#关键字导航" aria-label="Permalink to &quot;关键字导航&quot;">​</a></h4><p>当在 datagrip 的文本编辑区域编写 sql 时，按住键盘 Ctrl 键不放，同时鼠标移动到 sql 关键字上，比如表名、字段名称、或者是函数名上，鼠标会变成手型，关键字会变蓝，并加了下划线，点击，会自动定位到左侧对象树，并选中点击的对象</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5XmJ8ZzWEkt6BYBsuiapJgPzOh5uogvM4YwhIh1XV85V8GQicnnhTg3rg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h4 id="快速导航到指定的表、视图、函数等" tabindex="-1">快速导航到指定的表、视图、函数等 <a class="header-anchor" href="#快速导航到指定的表、视图、函数等" aria-label="Permalink to &quot;快速导航到指定的表、视图、函数等&quot;">​</a></h4><p>在 datagrip 中，使用 Ctrl+N 快捷键，弹出一个搜索框，输入需要导航的名称，回车即可</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5EIH7yuf97LD4eeGQcjuyIn1tReLEEG1icJY1SUial1u3r9Sp44zkoCnw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h4 id="全局搜索" tabindex="-1">全局搜索 <a class="header-anchor" href="#全局搜索" aria-label="Permalink to &quot;全局搜索&quot;">​</a></h4><p>连续两次按下 shift 键，或者鼠标点击右上角的搜索图标，弹出搜索框，搜索任何你想搜索的东西</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5C4466RpZiaPfwnSG3OqDP2YvotWZ3D20R2OgG04lfIe9YcZjf5EzzsA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h4 id="结果集搜索" tabindex="-1">结果集搜索 <a class="header-anchor" href="#结果集搜索" aria-label="Permalink to &quot;结果集搜索&quot;">​</a></h4><p>在查询结果集视图区域点击鼠标，按下 Ctrl+F 快捷键，弹出搜索框，输入搜索内容，支持正则表达式、过滤结果</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5ujwq7p9lc6K3xQkp4cM7fOiarj5Ab2KXNtI4JCEGg9gUicmu5G59Sjxg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h4 id="导航到关联数据" tabindex="-1">导航到关联数据 <a class="header-anchor" href="#导航到关联数据" aria-label="Permalink to &quot;导航到关联数据&quot;">​</a></h4><p>表之间会有外检关联，查询的时候，能直接定位到关联数据，或者被关联数据，例如 user1 表有个外检字段 classroom 指向 classroom 表的主键 id，在查询 classroom 表数据的时候，可以在 id 字段上右键，go to，referencing data</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5tFGXRKacs4gBcyeibALp6NwzYkhHtKicHibn9Nj1O3lmSh115Ihu7jSTA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">选择要显示第一条数据还是显示所有数据</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5cNEa8QpBqFt7ccz4DBhdU5lpMXhiaNNbhjIUFPr9f1Mic9ONpybWqicIw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">会自动打开关联表的数据</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5UUSNLqSnZyuLBnpKoFjNqxRoSeAeWEiaph5I7TUA5FYnqCNlGe0dVdA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">相反，查询字表的数据时，也能自动定位到父表</p><h3 id="数据转换" tabindex="-1">数据转换 <a class="header-anchor" href="#数据转换" aria-label="Permalink to &quot;数据转换&quot;">​</a></h3><h4 id="结果集数据过滤" tabindex="-1">结果集数据过滤 <a class="header-anchor" href="#结果集数据过滤" aria-label="Permalink to &quot;结果集数据过滤&quot;">​</a></h4><p>对于使用 table edit（对象树中选中表，右键-&gt;table editor）打开的结果集，可以使用条件继续过滤结果集，如下图所示，可以在结果集左上角输入款中输入 where 条件过滤</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5Mj5zjhqVGCKkeLbibgKibDQmXaxic2iaIibbLicnxGAicGO52CC1UfPlbW0yw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片">也可以对着需要过滤数据的列右键，filter by 过滤</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5QKWMMZk5uT8V1ZPrjia9Ric9lnqQMGacZNjDKHsX0ZncqxOhBkrZUmAw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h4 id="行转列" tabindex="-1">行转列 <a class="header-anchor" href="#行转列" aria-label="Permalink to &quot;行转列&quot;">​</a></h4><p>对于字段比较多的表，查看数据要左右推动，可以切换成列显示，在结果集视图区域使用 Ctrl+Q 快捷键</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5uT6GNfF6Q1ic6EA4JMMynPjIAGK8tdCASwvPWNDNZesg4HFzsjRD6Sg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h4 id="变量重命名" tabindex="-1">变量重命名 <a class="header-anchor" href="#变量重命名" aria-label="Permalink to &quot;变量重命名&quot;">​</a></h4><p>鼠标点击需要重命名的变量，按下 Shift+F6 快捷键，弹出重命名对话框，输入新的名称</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5dWJ3fLrdxibJ8vFd7ge6mlWqgjJrNwCh8NeX5TvetYZOrQmXiaXf0akQ/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h4 id="自动检测无法解析的对象" tabindex="-1">自动检测无法解析的对象 <a class="header-anchor" href="#自动检测无法解析的对象" aria-label="Permalink to &quot;自动检测无法解析的对象&quot;">​</a></h4><p>如果表名、字段名不存在，datagrip 会自动提示，此时对着有问题的表名或字段名，按下 Alt+Enter，会自动提示是否创建表或添加字段</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5QJaY87P4OjFnWP0MwqQLUT16WsOcviauaWicOD8hESBl9yIXPPic7RLPw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h4 id="权限定字段名" tabindex="-1">权限定字段名 <a class="header-anchor" href="#权限定字段名" aria-label="Permalink to &quot;权限定字段名&quot;">​</a></h4><p>对于查询使用表别名的，而字段中没有使用别名前缀的，datagrip 能自动添加前缀，鼠标停留在需要添加别名前缀的字段上，使用 Alt+Enter 快捷键</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5NHTibqoxTrFPRKqnd7ODgaG1qUddEqvJKtdSjxGlC2JDSFGcxxMttEA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h3 id="格式化" tabindex="-1">格式化 <a class="header-anchor" href="#格式化" aria-label="Permalink to &quot;格式化&quot;">​</a></h3><h4 id="通配符自动展开" tabindex="-1">*通配符自动展开 <a class="header-anchor" href="#通配符自动展开" aria-label="Permalink to &quot;*通配符自动展开&quot;">​</a></h4><p>查询的时候我们会使用 select <em>查询所有列，这是不好的习惯，datagrip 能快速展开列，光标定位到</em>后面，按下 Alt+Enter 快捷键</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5gaoKUic1XZiblBczyroOvMSFxs72CxIlzDtqLN2ibQ8BDR7IwzyFPbZqA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h4 id="大写自动转换⭐" tabindex="-1">大写自动转换⭐ <a class="header-anchor" href="#大写自动转换⭐" aria-label="Permalink to &quot;大写自动转换⭐&quot;">​</a></h4><blockquote><p>sql 使用大写形式是个好的习惯，如果使用了小写，可以将光标停留在需要转换的字段或表名上，使用 Ctrl+shift+U 快捷键自动转换</p></blockquote><h4 id="sql-格式化" tabindex="-1">sql 格式化 <a class="header-anchor" href="#sql-格式化" aria-label="Permalink to &quot;sql 格式化&quot;">​</a></h4><blockquote><p>选中需要格式化的 sql 代码，使用 Ctrl+Alt+L 快捷键，datagrip 提供了一个功能强大的编辑器，实现了 notpad++的列编辑模式</p></blockquote><h3 id="列编辑" tabindex="-1">列编辑 <a class="header-anchor" href="#列编辑" aria-label="Permalink to &quot;列编辑&quot;">​</a></h3><h4 id="多光标模式" tabindex="-1">多光标模式 <a class="header-anchor" href="#多光标模式" aria-label="Permalink to &quot;多光标模式&quot;">​</a></h4><blockquote><p>在编辑 sql 的时候，可能需要同时输入或同时删除一些字符，按下 alt+shift，同时鼠标在不同的位置点击，会出现多个光标</p></blockquote><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5TVB5YuQg2Eah1zKRCiaW8LA0C4cZkRMzwuR2ibicahqCHl12hvhQucgFg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h4 id="代码注释" tabindex="-1">代码注释 <a class="header-anchor" href="#代码注释" aria-label="Permalink to &quot;代码注释&quot;">​</a></h4><p>选中要注释的代码，按下 Ctrl+/或 Ctrl+shift+/快捷键，能注释代码，或取消注释</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5yMCwre4WfZUn1Qyj8W30cmPnVGibtdmVqFPOWBvQUG9YJp7exsYg0icA/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h4 id="列编辑-1" tabindex="-1">列编辑 <a class="header-anchor" href="#列编辑-1" aria-label="Permalink to &quot;列编辑&quot;">​</a></h4><p>按住键盘 Alt 键，同时按下鼠标左键拖动，能选择多列，拷贝黏贴等操作</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd59W2hico5YdFUMFiaQdaiagMQxeseqeiaU5iaZ7m60Fr4XTcEIfkqC24SOvg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h3 id="历史记录" tabindex="-1">历史记录 <a class="header-anchor" href="#历史记录" aria-label="Permalink to &quot;历史记录&quot;">​</a></h3><h4 id="代码历史" tabindex="-1">代码历史 <a class="header-anchor" href="#代码历史" aria-label="Permalink to &quot;代码历史&quot;">​</a></h4><p>在文本编辑器中，邮件，local history，show history，可以查看使用过的 sql 历史</p><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5O20lWlKTIIEUrx48NFWdLecNhnAMIG9yqKI4qIiaCMlM1aYL8uIH8yw/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h4 id="命令历史" tabindex="-1">命令历史 <a class="header-anchor" href="#命令历史" aria-label="Permalink to &quot;命令历史&quot;">​</a></h4><p><img src="https://mmbiz.qpic.cn/mmbiz_png/iaIdQfEric9TzUdlYibqcawzTbnibeicw1yd5y0dze0kalxbNHq8SF5B7egLMKBZh484WdPfAoCcNtib6XzV1yaS4Osg/640?wx_fmt=png&amp;wxfrom=5&amp;wx_lazy=1&amp;wx_co=1" alt="图片"></p><h3 id="运行" tabindex="-1">运行 <a class="header-anchor" href="#运行" aria-label="Permalink to &quot;运行&quot;">​</a></h3><blockquote><p>在每次写完sql后，都要用鼠标手动去点击一下执行这个图标，会让人不厌其烦，而datagrip中也提供了运行的快捷键，ctrl + enter,如下图，成功运行：</p></blockquote><h1 id="pycharm" tabindex="-1">PyCharm <a class="header-anchor" href="#pycharm" aria-label="Permalink to &quot;PyCharm&quot;">​</a></h1><h2 id="快捷键" tabindex="-1">快捷键 <a class="header-anchor" href="#快捷键" aria-label="Permalink to &quot;快捷键&quot;">​</a></h2><h3 id="_1、代码编辑" tabindex="-1">1、代码编辑 <a class="header-anchor" href="#_1、代码编辑" aria-label="Permalink to &quot;1、代码编辑&quot;">​</a></h3><table><thead><tr><th>序号</th><th>快捷键</th><th>作用</th></tr></thead><tbody><tr><td>1</td><td>CTRL+ALT+SPACE</td><td>快速导入任意类</td></tr><tr><td>2</td><td>CTRL+SHIFT+ENTER</td><td>代码补全</td></tr><tr><td>3</td><td>SHIFT+F1</td><td>查看外部文档</td></tr><tr><td>4</td><td>CTRL+Q</td><td>快速查找文档</td></tr><tr><td>5</td><td>CTRL+P</td><td>参数信息（在方法中调用的参数）</td></tr><tr><td>6</td><td>CTRL+MOUSEOVERCODE</td><td>基本信息</td></tr><tr><td>7</td><td>CTRL+F1</td><td>显示错误或警告的描述</td></tr><tr><td>8</td><td>CTRL+INSERT</td><td>生成代码</td></tr><tr><td>9</td><td>CTRL+O</td><td>重载方法</td></tr><tr><td>10</td><td>CTRL+ALT+T</td><td>包裹代码</td></tr><tr><td>11</td><td>CTRL+/</td><td>单行注释</td></tr><tr><td>12</td><td>CTRL+SHIFT+/</td><td>块注释</td></tr><tr><td>13</td><td>CTRL+W</td><td>逐步选择代码（块）</td></tr><tr><td>14</td><td>CTRL+SHIFT+W</td><td>逐步取消选择代码（块）</td></tr><tr><td>15</td><td>CTRL+SHIFT+[</td><td>从当前位置选择到代码块的开始</td></tr><tr><td>16</td><td>CTRL+SHIFT+]</td><td>从当前位置选择到代码块的结束</td></tr><tr><td>17</td><td>ALT+ENTER</td><td>代码快速修正</td></tr><tr><td>18</td><td>CTRL+ALT+L</td><td>代码格式标准化</td></tr><tr><td>19</td><td>CTRL+ALT+O</td><td>最佳化导入</td></tr><tr><td>20</td><td>CTRL+ALT+I</td><td>自动缩进</td></tr><tr><td>21</td><td>TAB</td><td>代码向后缩进</td></tr><tr><td>23</td><td>SHIFT+TAB</td><td>代码向前取消缩进</td></tr><tr><td>24</td><td>CTRL+SHIFT+V</td><td>历史复制粘贴表</td></tr><tr><td>25</td><td>CTRL+D</td><td>复制当前代码行/块</td></tr><tr><td>26</td><td>CTRL+Y</td><td>删除当前代码行/块</td></tr><tr><td>27</td><td>CTRL+SHIFT+J</td><td>代码连接为一行</td></tr><tr><td>28</td><td>SHIFT+ENTER</td><td>开启新一行</td></tr><tr><td>28</td><td>CTRL+SHIFT+U</td><td>字母大写</td></tr><tr><td>29</td><td>CTRL+DELETE</td><td>向后逐渐删除</td></tr><tr><td>30</td><td>CTRL+BACKSPACE</td><td>向前逐渐删除</td></tr><tr><td>31</td><td>CTRL+NUMPAD+/-</td><td>代码块展开/折叠</td></tr><tr><td>32</td><td>CTRL+SHIFT+NUMPAD+</td><td>所有代码块展开叠</td></tr><tr><td>33</td><td>CTRL+SHIFT+NUMPAD-</td><td>所有代码块折叠</td></tr><tr><td>34</td><td>CTRL+F4</td><td>关闭活动编辑窗口</td></tr></tbody></table><h3 id="_2、搜索-替换" tabindex="-1">2、搜索/替换 <a class="header-anchor" href="#_2、搜索-替换" aria-label="Permalink to &quot;2、搜索/替换&quot;">​</a></h3><table><thead><tr><th>序号</th><th>快捷键</th><th>作用</th></tr></thead><tbody><tr><td>1</td><td>CTRL+F</td><td>查找</td></tr><tr><td>2</td><td>F3</td><td>查找下一个</td></tr><tr><td>3</td><td>SHIFT+F3</td><td>查找上一个</td></tr><tr><td>4</td><td>CTRL+R</td><td>替换</td></tr><tr><td>5</td><td>CTRL+SHIFT+F</td><td>指定路径下查找</td></tr><tr><td>6</td><td>CTRL+SHIFT+R</td><td>指定路径下替换</td></tr></tbody></table><h3 id="_3、代码运行" tabindex="-1">3、代码运行 <a class="header-anchor" href="#_3、代码运行" aria-label="Permalink to &quot;3、代码运行&quot;">​</a></h3><table><thead><tr><th>序号</th><th>快捷键</th><th>作用</th></tr></thead><tbody><tr><td>1</td><td>ALT+SHIFT+F10</td><td>选择程序文件并运行代码</td></tr><tr><td>2</td><td>ALT+SHIFT+F9</td><td>选择程序文件并调试代码</td></tr><tr><td>3</td><td>SHIFT+F10</td><td>运行代码</td></tr><tr><td>4</td><td>SHIFT+F9</td><td>调试代码</td></tr><tr><td>5</td><td>CTRL+SHIFT+F10</td><td>运行当前编辑区的程序文件</td></tr></tbody></table><h3 id="_4、代码调试" tabindex="-1">4、代码调试 <a class="header-anchor" href="#_4、代码调试" aria-label="Permalink to &quot;4、代码调试&quot;">​</a></h3><table><thead><tr><th>序号</th><th>快捷键</th><th>作用</th></tr></thead><tbody><tr><td>1</td><td>F8</td><td>单步</td></tr><tr><td>2</td><td>F7</td><td>单步（无函数时同F8）</td></tr><tr><td>3</td><td>SHIFT+F8</td><td>单步跳出</td></tr><tr><td>4</td><td>ALT+F9</td><td>运行到光标所在位置处</td></tr><tr><td>5</td><td>ALT+F8</td><td>测试语句</td></tr><tr><td>6</td><td>F9</td><td>重新运行程序</td></tr><tr><td>7</td><td>CTRL+F8</td><td>切换断点</td></tr><tr><td>8</td><td>CTRL+F8</td><td>查看断点</td></tr></tbody></table><h3 id="_5、应用搜索" tabindex="-1">5、应用搜索 <a class="header-anchor" href="#_5、应用搜索" aria-label="Permalink to &quot;5、应用搜索&quot;">​</a></h3><table><thead><tr><th>序号</th><th>快捷键</th><th>作用</th></tr></thead><tbody><tr><td>1</td><td>ALT+F7</td><td>查找应用</td></tr><tr><td>2</td><td>CTRL+F7</td><td>在文件中查找应用</td></tr><tr><td>3</td><td>CTRL+SHIFT+F7</td><td>在文件中高亮应用</td></tr><tr><td>4</td><td>CTRL+ALT+F7</td><td>显示应用</td></tr></tbody></table><h3 id="_6、代码重构" tabindex="-1">6、代码重构 <a class="header-anchor" href="#_6、代码重构" aria-label="Permalink to &quot;6、代码重构&quot;">​</a></h3><table><thead><tr><th>序号</th><th>快捷键</th><th>作用</th></tr></thead><tbody><tr><td>1</td><td>F5</td><td>复制文件</td></tr><tr><td>2</td><td>F6</td><td>移动文件</td></tr><tr><td>3</td><td>SHIFT+F6</td><td>重命名</td></tr><tr><td>4</td><td>ALT+DELETE</td><td>安全删除</td></tr><tr><td>5</td><td>CTRL+F6</td><td>改变函数形式参数</td></tr><tr><td>6</td><td>CTRL+ALT+M</td><td>将代码提取为函数</td></tr><tr><td>7</td><td>CTRL+ALT+V</td><td>将代码提取为变量</td></tr><tr><td>8</td><td>CTRL+ALT+C</td><td>将代码提取为常数</td></tr><tr><td>9</td><td>CTRL+ALT+F</td><td>将代码提取为字段</td></tr><tr><td>10</td><td>CTRL+ALT+P</td><td>将代码提取为参数</td></tr></tbody></table><h3 id="_7、动态模块" tabindex="-1">7、动态模块 <a class="header-anchor" href="#_7、动态模块" aria-label="Permalink to &quot;7、动态模块&quot;">​</a></h3><table><thead><tr><th>序号</th><th>快捷键</th><th>作用</th></tr></thead><tbody><tr><td>1</td><td>CTRL+ALT+J</td><td>使用动态模板包裹</td></tr><tr><td>2</td><td>CTRL+J</td><td>插入动态模板</td></tr></tbody></table><h3 id="_8、导航" tabindex="-1">8、导航 <a class="header-anchor" href="#_8、导航" aria-label="Permalink to &quot;8、导航&quot;">​</a></h3><table><thead><tr><th>序号</th><th>快捷键</th><th>作用</th></tr></thead><tbody><tr><td>1</td><td>CTRL+N</td><td>进入类</td></tr><tr><td>2</td><td>CTRL+SHIFT+N</td><td>进入文件</td></tr><tr><td>3</td><td>CTRL+ALT+SHIFT+N</td><td>进入符号</td></tr><tr><td>4</td><td>CTRL+←←</td><td>进入上一个编辑位置</td></tr><tr><td>5</td><td>CTRL+→→</td><td>进入下一个编辑位置</td></tr><tr><td>6</td><td>CTRL+→→</td><td>进入下一个编辑位置</td></tr><tr><td>7</td><td>SHIFT+ESC</td><td>隐藏活动/最后活动的窗口</td></tr><tr><td>8</td><td>CTRL+SHIFT+F4</td><td>关闭活动的运行/消息/查找等窗口</td></tr><tr><td>9</td><td>CTRL+G</td><td>显示光标所在行与列</td></tr><tr><td>10</td><td>CTRL+E</td><td>弹出最近打开的文件</td></tr><tr><td>11</td><td>CTRL+ALT+←/→←/→</td><td>向前/向后导航</td></tr><tr><td>12</td><td>CTRL+SHIFT+BACKSPACE</td><td>导航到最后编辑的位置</td></tr><tr><td>13</td><td>CTRL+B</td><td>跳转到声明部分</td></tr><tr><td>14</td><td>CTRL+CLICK(鼠标左键)</td><td>跳转到声明部分</td></tr><tr><td>15</td><td>CTRL+ALT+B</td><td>跳转到代码实施部分</td></tr><tr><td>16</td><td>CTRL+SHIFT+I</td><td>打开快速定义查找</td></tr><tr><td>16</td><td>CTRL+SHIFT+B</td><td>跳转到类型说明</td></tr><tr><td>17</td><td>CTRL+U</td><td>跳转超类/方法</td></tr><tr><td>18</td><td>CTRL+↑↑</td><td>跳转到上一个方法</td></tr><tr><td>19</td><td>CTRL+↓↓</td><td>跳转到下一个方法</td></tr><tr><td>20</td><td>CTRL+[</td><td>跳转到代码块的开头</td></tr><tr><td>21</td><td>CTRL+]</td><td>跳转到代码块的结尾</td></tr><tr><td>22</td><td>CTRL+F12</td><td>弹出文件结构</td></tr><tr><td>23</td><td>CTRL+H</td><td>弹出类层次结构</td></tr><tr><td>24</td><td>CTRL+SHIFT+H</td><td>弹出方法层次结构</td></tr><tr><td>25</td><td>CTRL+ALT+H</td><td>弹出调用层次结构</td></tr><tr><td>26</td><td>F2/SHIFT+F2</td><td>下一个/上一个错误</td></tr><tr><td>27</td><td>F4</td><td>查看源代码</td></tr><tr><td>28</td><td>ALT+HOME</td><td>显示导航栏</td></tr><tr><td>29</td><td>F2/SHIFT+F2</td><td>下一个/上一个错误</td></tr><tr><td>30</td><td>F11</td><td>增加书签</td></tr><tr><td>31</td><td>CTRL+F11</td><td>增加数字/字母书签</td></tr><tr><td>32</td><td>CTRL+SHIFT+[1-9]</td><td>增加数字书签</td></tr><tr><td>33</td><td>SHIFT+F11</td><td>显示书签</td></tr></tbody></table><h3 id="_9、通用" tabindex="-1">9、通用 <a class="header-anchor" href="#_9、通用" aria-label="Permalink to &quot;9、通用&quot;">​</a></h3><table><thead><tr><th>序号</th><th>快捷键</th><th>作用</th></tr></thead><tbody><tr><td>1</td><td>ALT+[0-9]</td><td>打开相应的工具窗口</td></tr><tr><td>2</td><td>CTRL+ALT+Y</td><td>同步</td></tr><tr><td>3</td><td>CTRL+SHIFT+F12</td><td>最大化编辑器</td></tr><tr><td>4</td><td>ALT+SHIFT+F</td><td>添加到收藏夹</td></tr><tr><td>5</td><td>ALT+SHIFT+I</td><td>使用当前配置文件检查当前文件</td></tr><tr><td>6</td><td>CTRL+ALT+S</td><td>快速出现设置对话框</td></tr><tr><td>7</td><td>CTRL+SHIFT+A</td><td>查找并调试编辑器的功能</td></tr><tr><td>8</td><td>ALT+TAB</td><td>在选项卡和工具窗口之间切换</td></tr></tbody></table><h2 id="插件" tabindex="-1">插件 <a class="header-anchor" href="#插件" aria-label="Permalink to &quot;插件&quot;">​</a></h2><h3 id="rainbow-csv" tabindex="-1">Rainbow CSV <a class="header-anchor" href="#rainbow-csv" aria-label="Permalink to &quot;Rainbow CSV&quot;">​</a></h3><p>该插件的作用在于能够对<code>CSV</code>文件当中的不同的行都可以用不同的颜色标出，如下图所示</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304151111384.png" alt="image-20230415111115217" style="zoom:80%;"><p>这样当我们查阅起<code>CSV</code>文件的时候自然会方便许多</p><h3 id="rainbow-brackets" tabindex="-1">Rainbow Brackets <a class="header-anchor" href="#rainbow-brackets" aria-label="Permalink to &quot;Rainbow Brackets&quot;">​</a></h3><p>该插件的作用在于能够将括号以不同的颜色标注出来，这个非常的便捷在于我们能够快速地找出到底有哪几个括号是缺失的，如下图所示</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304151111941.png" alt="image-20230415111123783" style="zoom:67%;"><h3 id="indent-rainbow" tabindex="-1">Indent Rainbow <a class="header-anchor" href="#indent-rainbow" aria-label="Permalink to &quot;Indent Rainbow&quot;">​</a></h3><p>该插件的作用在于能够对于不同层级缩进的空格标注不同的颜色，如下图所示</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304151111873.png" alt="image-20230415111148713" style="zoom:80%;"><h3 id="tabnine" tabindex="-1">Tabnine <a class="header-anchor" href="#tabnine" aria-label="Permalink to &quot;Tabnine&quot;">​</a></h3><p>该插件主要在于可以帮助我们自动填充代码，由于是在<strong>人工智能技术</strong>的驱动之下，因此每次都可以精准的预测我们将要填充的究竟是什么代码。</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304151112259.png" alt="image-20230415111208088" style="zoom:80%;"><h3 id="codeglance" tabindex="-1">CodeGlance <a class="header-anchor" href="#codeglance" aria-label="Permalink to &quot;CodeGlance&quot;">​</a></h3><p>该插件的主要作用表现为会在<code>IDE</code>的最右侧生成一条工具栏，这样可以更加便捷的跳转至所要寻找的代码位置</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304151112797.png" alt="image-20230415111237618" style="zoom:80%;"><h3 id="material-theme" tabindex="-1">Material Theme <a class="header-anchor" href="#material-theme" aria-label="Permalink to &quot;Material Theme&quot;">​</a></h3><p>该插件的作用在于能够为<code>Pycharm</code>提供多种不同的页面风格大家则可以根据自己的喜好选择不同风格的页面</p><img src="https://edu-8673.oss-cn-beijing.aliyuncs.com/img2023.3.30/202304151113412.png" alt="image-20230415111317257" style="zoom:80%;"></div></div></main><footer class="VPDocFooter" data-v-6b87e69f data-v-37656e44><!--[--><!--]--><!----><nav class="prev-next" data-v-37656e44><div class="pager" data-v-37656e44><!----></div><div class="pager" data-v-37656e44><a class="pager-link next" href="/notebook/Java/Java%E5%9F%BA%E7%A1%80.html" data-v-37656e44><span class="desc" data-v-37656e44>Next page</span><span class="title" data-v-37656e44>Java基础</span></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
    <script>window.__VP_HASH_MAP__=JSON.parse("{\"2、数据库_mysql_mysql面试_基础.md\":\"40da680a\",\"1、学前端_5、小程序_小程序项目.md\":\"60a1629b\",\"1、学前端_4、node_知识篇.md\":\"a7fb500e\",\"1、学前端_2、js_ts_es6 进阶.md\":\"6d07ba10\",\"1、学前端_3、vue_vue3_vue3进阶.md\":\"7ac622b4\",\"5、运维_jenkins.md\":\"929081f8\",\"1、学前端_2、js_ts_typescript.md\":\"875a4aa4\",\"2、数据库_mysql_mysql核心_设计.md\":\"7faf46d1\",\"2、数据库_mysql_mysql核心_基础.md\":\"d8e97f3e\",\"1、学前端_1、html_css_html基础.md\":\"7584d076\",\"1、学前端_5、专题篇_问题篇.md\":\"e893aaa2\",\"2、数据库_mysql_mysql面试_进阶.md\":\"f934806d\",\"3、springboot_运维_原理.md\":\"f4a39db6\",\"2、数据库_influxdb.md\":\"6e1711e1\",\"3、springboot_新特性.md\":\"cdf3e307\",\"mybatis_mybatisplus_jpa.md\":\"8e41681b\",\"1、学前端_5、小程序_小程序优化.md\":\"a2185198\",\"2、数据库_redis_redis基础.md\":\"856df0e0\",\"linux_实用脚本.md\":\"f2299dd5\",\"4、微服务_必备_分布式基础.md\":\"d49863d5\",\"2、数据库_redis_redis优化.md\":\"e66ae32f\",\"4、微服务_springsecurity_进阶篇.md\":\"235a8e9e\",\"5、运维_chatgpt.md\":\"10db3823\",\"2、数据库_mysql_分库分表.md\":\"e1c8a095\",\"start.md\":\"9bc1ff8d\",\"5、运维_github.md\":\"2ec6c735\",\"java学前端_css.md\":\"f11b47f0\",\"1、学前端_5、专题篇_知识篇.md\":\"a463ed8d\",\"linux_软件部署.md\":\"d6722925\",\"2、数据库_neo4j.md\":\"97ad22ac\",\"team.md\":\"ce467a6a\",\"nginx_实战篇.md\":\"7785486e\",\"index.md\":\"8c3ec167\",\"计算机基础_计算机网络_网络基础.md\":\"7a54a85d\",\"1、学前端_4、node_进阶篇.md\":\"60f6db69\",\"java_java集合.md\":\"a049b313\",\"1、学前端_3、vue_vue3_vue3高级.md\":\"614d1516\",\"1、学前端_5、小程序_微信小程序.md\":\"9a4be771\",\"5、运维_netty.md\":\"12ca0278\",\"2、数据库_mysql_mysql核心_运维.md\":\"83f97c16\",\"idea_vs code.md\":\"afdcb593\",\"java学前端_vue3_组件.md\":\"1086884e\",\"idea_chrome.md\":\"4a32afbc\",\"云原生_k8s.md\":\"db58e65a\",\"2、数据库_mysql_mysql核心_进阶.md\":\"61d16dff\",\"ssm_springbatch.md\":\"f799ab4a\",\"三高_分布式.md\":\"db1b8a1b\",\"2、数据库_elasticsearch_1、es基础.md\":\"04d17448\",\"linux_linux基础.md\":\"4b0bf394\",\"idea_idea插件.md\":\"fa86e45a\",\"可视化 _ 监控_可视化大屏.md\":\"004553bd\",\"2、数据库_mongodb_整合.md\":\"3c47d7f4\",\"4、微服务_springsecurity_基础篇.md\":\"534a3401\",\"4、微服务_进阶.md\":\"69095c58\",\"计算机基础_计算机基础_操作系统.md\":\"0f75d113\",\"可视化 _ 监控_zabbix.md\":\"71f2270e\",\"nginx_基础篇.md\":\"c7d8bb50\",\"1、学前端_4、node_项目实战.md\":\"bc5065b8\",\"2、数据库_redis_redis原理.md\":\"5cedf685\",\"可视化 _ 监控_监控基础.md\":\"ac56ce4d\",\"三高_高并发.md\":\"ea9ffc99\",\"2、数据库_redis_redis高级.md\":\"1d5872f6\",\"1、学前端_4、node_基础篇.md\":\"581cc13a\",\"2、数据库_mongodb_基础.md\":\"fb7a0a29\",\"idea_idea基础.md\":\"6f2f9638\",\"4、微服务_必备_sentinel.md\":\"2edfbf6c\",\"2、数据库_elasticsearch_3、es高级.md\":\"ef146606\",\"1、学前端_3、vue_vue3_vue3新语法.md\":\"8afd5409\",\"消息中间件_canal.md\":\"3949163c\",\"ssm_maven.md\":\"2c5e12ed\",\"4、微服务_springsecurity_高级篇.md\":\"882d3ff3\",\"linux_linux进阶.md\":\"188ef7b4\",\"计算机基础_设计模式_uml.md\":\"634ba256\",\"计算机基础_算法_leetcode.md\":\"77162fb9\",\"项目实战_小兔鲜_进阶篇1.md\":\"17c52c81\",\"1、学前端_2、js_ts_es6 基础.md\":\"fda3f18b\",\"项目实战_小兔鲜_进阶篇2.md\":\"a0f23006\",\"软件测试_测试基础.md\":\"8c1060cd\",\"2、数据库_redis_本地缓存.md\":\"00617fe6\",\"nginx_面试篇.md\":\"e3fb373a\",\"mybatis_mybatisplus_mybatis.md\":\"9239e0ad\",\"linux_shell.md\":\"ae53d83b\",\"2、数据库_mysql_mysql核心_优化.md\":\"36230425\",\"项目实战_项目推荐.md\":\"f9d97630\",\"mybatis_mybatisplus_mybatisplus.md\":\"0030fd35\",\"项目实战_百度地图_进阶篇.md\":\"c8b93267\",\"三高_高可用.md\":\"323840c5\",\"java_java新特性.md\":\"22abf56d\",\"软件测试_压力测试.md\":\"9ab44440\",\"java学前端_html_js.md\":\"e0fcd240\",\"2、数据库_redis_redis实战.md\":\"d6daeeab\",\"nginx_进阶篇.md\":\"e6b63195\",\"三高_秒杀.md\":\"3878bb64\",\"5、运维_git.md\":\"0264925c\",\"java_java进阶.md\":\"e79cb5b4\",\"并发 _ 多线程_基础篇.md\":\"7adbfac5\",\"项目实战_百度地图_基础篇.md\":\"8afa5954\",\"java学前端_react.md\":\"3ec827dd\",\"1、学前端_1、html_css_css基础.md\":\"01b56712\",\"项目实战_小兔鲜_基础篇.md\":\"646f5df5\",\"1、学前端_2、js_ts_js 基础.md\":\"cb13e36f\",\"可视化 _ 监控_监控进阶.md\":\"0cdbc292\",\"计算机基础_设计模式_基础篇.md\":\"51617287\",\"计算机基础_数据结构_基础篇.md\":\"b2bfd8d4\",\"项目实战_苍穹外卖_进阶篇.md\":\"48415e41\",\"ssm_spring.md\":\"ab514659\",\"消息中间件_rabbitmq.md\":\"45b1eb28\",\"1、学前端_1、html_css_网页进阶.md\":\"db998248\",\"消息中间件_kafka.md\":\"b747dabf\",\"云原生_docker.md\":\"983c7ba7\",\"4、微服务_必备_分布式锁.md\":\"5af1cf8d\",\"消息中间件_rocketmq.md\":\"d441da85\",\"项目实战_黑马头条_基础篇.md\":\"b05af3a6\",\"ssm_springmvc.md\":\"81b9714f\",\"项目实战_支付.md\":\"1d7407dd\",\"项目实战_黑马头条_进阶篇2.md\":\"bff0015b\",\"项目实战_黑马头条_进阶篇.md\":\"19f18388\",\"java学前端_vue2_组件.md\":\"58c6b1df\",\"3、springboot_基础篇.md\":\"529c66f4\",\"3、springboot_应用篇.md\":\"8b92aa61\",\"项目实战_黑马头条_高级篇.md\":\"227c08c1\",\"1、学前端_5、小程序_uniapp.md\":\"71a282b4\",\"项目实战_云尚办公_基础篇.md\":\"1fe188ba\",\"并发 _ 多线程_并发完善.md\":\"26619c46\",\"1、学前端_2、js_ts_js 进阶.md\":\"657dfb8f\",\"java_java高级.md\":\"23782d1a\",\"java_java基础.md\":\"86d67c77\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"VitePress\",\"description\":\"A VitePress site\",\"base\":\"/notebook/\",\"head\":[],\"appearance\":true,\"themeConfig\":{\"algolia\":{\"appId\":\"DW7O63I9IR\",\"apiKey\":\"f8ed758cdb288a8b06542bc35923c1a1\",\"indexName\":\"notebook\"},\"sidebar\":[{\"text\":\"Java\",\"collapsed\":true,\"items\":[{\"text\":\"Java基础\",\"link\":\"/Java/Java基础\"},{\"text\":\"Java新特性\",\"link\":\"/Java/Java新特性\"},{\"text\":\"Java进阶\",\"link\":\"/Java/Java进阶\"},{\"text\":\"Java集合\",\"link\":\"/Java/Java集合\"},{\"text\":\"Java高级\",\"link\":\"/Java/Java高级\"}]},{\"text\":\"Linux\",\"collapsed\":true,\"items\":[{\"text\":\"Linux基础\",\"link\":\"/Linux/Linux基础\"},{\"text\":\"Linux新特性\",\"link\":\"/Linux/Linux进阶\"},{\"text\":\"Shell脚本\",\"link\":\"/Linux/Shell\"},{\"text\":\"实用脚本\",\"link\":\"/Linux/实用脚本\"},{\"text\":\"软件部署\",\"link\":\"/Linux/软件部署\"}]},{\"text\":\"Nginx\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/Nginx/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/Nginx/进阶篇\"},{\"text\":\"实战篇\",\"link\":\"/Nginx/实战篇\"},{\"text\":\"面试篇\",\"link\":\"/Nginx/面试篇\"}]},{\"text\":\"SSM\",\"collapsed\":true,\"items\":[{\"text\":\"Maven\",\"link\":\"/SSM/Maven\"},{\"text\":\"Spring\",\"link\":\"/SSM/Spring\"},{\"text\":\"SpringMVC\",\"link\":\"/SSM/SpringMVC\"},{\"text\":\"SpringBatch\",\"link\":\"/SSM/SpringBatch\"}]},{\"text\":\"SpringBoot\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/3、SpringBoot/基础篇\"},{\"text\":\"应用篇\",\"link\":\"/3、SpringBoot/应用篇\"},{\"text\":\"新特性\",\"link\":\"/3、SpringBoot/新特性\"},{\"text\":\"运维&原理\",\"link\":\"/3、SpringBoot/运维&原理\"}]},{\"text\":\"SpringCloud\",\"collapsed\":true,\"items\":[{\"text\":\"SpringCloud\",\"link\":\"/4、微服务/进阶\"},{\"text\":\"Sentinel\",\"link\":\"/4、微服务/必备/Sentinel\"}]},{\"text\":\"SpringSecurity\",\"collapsed\":true,\"items\":[{\"text\":\"SpringSecurity基础篇\",\"link\":\"/4、微服务/SpringSecurity/基础篇\"},{\"text\":\"SpringSecurity进阶篇\",\"link\":\"/4、微服务/SpringSecurity/进阶篇\"},{\"text\":\"SpringSecurity高级篇\",\"link\":\"/4、微服务/SpringSecurity/高级篇\"}]},{\"text\":\"Mybatis & MybatisPlus\",\"collapsed\":true,\"items\":[{\"text\":\"Mybatis\",\"link\":\"/Mybatis&MybatisPlus/Mybatis\"},{\"text\":\"MybatisPlus\",\"link\":\"/Mybatis&MybatisPlus/MybatisPlus\"},{\"text\":\"JPA\",\"link\":\"/Mybatis&MybatisPlus/JPA\"}]},{\"text\":\"Git & ChatGPT\",\"collapsed\":true,\"items\":[{\"text\":\"Git\",\"link\":\"/5、运维/Git\"},{\"text\":\"Github\",\"link\":\"/5、运维/Github\"},{\"text\":\"ChatGPT\",\"link\":\"/5、运维/ChatGPT\"},{\"text\":\"Jenkins\",\"link\":\"/5、运维/Jenkins\"},{\"text\":\"Netty\",\"link\":\"/5、运维/Netty\"}]},{\"text\":\"数据库\",\"collapsed\":true,\"items\":[{\"text\":\"MySQL\",\"collapsed\":true,\"items\":[{\"text\":\"MySQL基础\",\"link\":\"/2、数据库/MySQL/MySQL核心/基础\"},{\"text\":\"MySQL进阶\",\"link\":\"/2、数据库/MySQL/MySQL核心/进阶\"},{\"text\":\"MySQL优化\",\"link\":\"/2、数据库/MySQL/MySQL核心/优化\"},{\"text\":\"MySQL设计\",\"link\":\"/2、数据库/MySQL/MySQL核心/设计\"},{\"text\":\"MySQL运维\",\"link\":\"/2、数据库/MySQL/MySQL核心/运维\"},{\"text\":\"分库分表\",\"link\":\"/2、数据库/MySQL/分库分表\"}]},{\"text\":\"Redis\",\"collapsed\":true,\"items\":[{\"text\":\"Redis基础\",\"link\":\"/2、数据库/Redis/Redis基础\"},{\"text\":\"Redis优化\",\"link\":\"/2、数据库/Redis/Redis优化\"},{\"text\":\"Redis原理\",\"link\":\"/2、数据库/Redis/Redis原理\"},{\"text\":\"Redis高级\",\"link\":\"/2、数据库/Redis/Redis高级\"},{\"text\":\"Redis实战\",\"link\":\"/2、数据库/Redis/Redis实战\"},{\"text\":\"本地缓存\",\"link\":\"/2、数据库/Redis/本地缓存\"}]},{\"text\":\"MongoDB\",\"collapsed\":true,\"items\":[{\"text\":\"MongoDB基础\",\"link\":\"/2、数据库/MongoDB/基础\"},{\"text\":\"MongoDB进阶\",\"link\":\"/2、数据库/MongoDB/整合\"}]},{\"text\":\"ElasticSearch\",\"collapsed\":true,\"items\":[{\"text\":\"ES基础\",\"link\":\"/2、数据库/ElasticSearch/1、ES基础\"},{\"text\":\"ES高级\",\"link\":\"/2、数据库/ElasticSearch/3、ES高级\"}]},{\"text\":\"InfluxDB\",\"link\":\"/2、数据库/influxdb\"},{\"text\":\"Neo4j\",\"link\":\"/2、数据库/Neo4j\"}]},{\"text\":\"高并发 & 秒杀 & 分布式\",\"collapsed\":true,\"items\":[{\"text\":\"分布式理论\",\"link\":\"/三高/分布式\"},{\"text\":\"分布式锁\",\"link\":\"/4、微服务/必备/分布式锁\"},{\"text\":\"秒杀\",\"link\":\"/三高/秒杀\"},{\"text\":\"高可用\",\"link\":\"/三高/高可用\"},{\"text\":\"高并发\",\"link\":\"/三高/高并发\"}]},{\"text\":\"云原生\",\"collapsed\":true,\"items\":[{\"text\":\"Docker\",\"link\":\"/云原生/Docker\"},{\"text\":\"K8S\",\"link\":\"/云原生/K8S\"}]},{\"text\":\"可视化 & 监控\",\"collapsed\":true,\"items\":[{\"text\":\"监控基础\",\"link\":\"/可视化 & 监控/监控基础\"},{\"text\":\"监控进阶\",\"link\":\"/可视化 & 监控/监控进阶\"},{\"text\":\"可视化大屏\",\"link\":\"/可视化 & 监控/可视化大屏\"},{\"text\":\"Zabbix\",\"link\":\"/可视化 & 监控/Zabbix\"}]},{\"text\":\"学前端\",\"collapsed\":true,\"items\":[{\"text\":\"HTML+CSS\",\"collapsed\":true,\"items\":[{\"text\":\"HTML基础\",\"link\":\"/1、学前端/1、HTML+CSS/HTML基础\"},{\"text\":\"CSS基础\",\"link\":\"/1、学前端/1、HTML+CSS/CSS基础\"},{\"text\":\"网页进阶\",\"link\":\"/1、学前端/1、HTML+CSS/网页进阶\"}]},{\"text\":\"JS+TS\",\"collapsed\":true,\"items\":[{\"text\":\"JS基础\",\"link\":\"/1、学前端/2、JS+TS/JS 基础\"},{\"text\":\"JS进阶\",\"link\":\"/1、学前端/2、JS+TS/JS 进阶\"},{\"text\":\"ES6基础\",\"link\":\"/1、学前端/2、JS+TS/ES6 基础\"},{\"text\":\"ES6进阶\",\"link\":\"/1、学前端/2、JS+TS/ES6 进阶\"},{\"text\":\"TS基础\",\"link\":\"/1、学前端/2、JS+TS/TypeScript\"}]},{\"text\":\"NodeJS\",\"collapsed\":true,\"items\":[{\"text\":\"Node基础\",\"link\":\"/1、学前端/4、Node/基础篇\"},{\"text\":\"Node进阶\",\"link\":\"/1、学前端/4、Node/进阶篇\"},{\"text\":\"项目实战\",\"link\":\"/1、学前端/4、Node/项目实战\"}]},{\"text\":\"Vue\",\"collapsed\":true,\"items\":[{\"text\":\"Vue3进阶\",\"link\":\"/1、学前端/3、Vue/Vue3/Vue3进阶\"},{\"text\":\"Vue3高级\",\"link\":\"/1、学前端/3、Vue/Vue3/Vue3高级\"},{\"text\":\"Vue3新语法\",\"link\":\"/1、学前端/3、Vue/Vue3/Vue3新语法\"},{\"text\":\"项目实战\",\"link\":\"/1、学前端/3、Vue/Vue2/Vue2项目\"}]},{\"text\":\"小程序\",\"collapsed\":true,\"items\":[{\"text\":\"小程序基础\",\"link\":\"/1、学前端/5、小程序/微信小程序\"},{\"text\":\"小程序优化\",\"link\":\"/1、学前端/5、小程序/小程序优化\"},{\"text\":\"uniapp\",\"link\":\"/1、学前端/5、小程序/uniapp\"},{\"text\":\"项目实战\",\"link\":\"/1、学前端/5、小程序/小程序项目\"}]}]},{\"text\":\"计算机基础\",\"collapsed\":true,\"items\":[{\"text\":\"数据结构\",\"link\":\"/计算机基础/数据结构/基础篇\"},{\"text\":\"操作系统\",\"link\":\"/计算机基础/计算机基础/操作系统\"},{\"text\":\"设计模式\",\"link\":\"/计算机基础/设计模式/基础篇\"},{\"text\":\"计算机网络\",\"link\":\"/计算机基础/计算机网络/网络基础\"},{\"text\":\"UML\",\"link\":\"/计算机基础/设计模式/UML\"},{\"text\":\"LeetCode\",\"link\":\"/计算机基础/算法/LeetCode\"}]},{\"text\":\"项目实战\",\"collapsed\":true,\"items\":[{\"text\":\"云尚办公\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/云尚办公/基础篇\"}]},{\"text\":\"小兔鲜\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/小兔鲜/基础篇\"},{\"text\":\"进阶篇1\",\"link\":\"/项目实战/小兔鲜/进阶篇1\"},{\"text\":\"进阶篇2\",\"link\":\"/项目实战/小兔鲜/进阶篇2\"}]},{\"text\":\"地图\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/百度地图/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/项目实战/百度地图/进阶篇\"}]},{\"text\":\"苍穹外卖\",\"collapsed\":true,\"items\":[{\"text\":\"进阶篇\",\"link\":\"/项目实战/苍穹外卖/进阶篇\"}]},{\"text\":\"黑马头条\",\"collapsed\":true,\"items\":[{\"text\":\"基础篇\",\"link\":\"/项目实战/黑马头条/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/项目实战/黑马头条/进阶篇\"},{\"text\":\"进阶篇2\",\"link\":\"/项目实战/黑马头条/进阶篇2\"},{\"text\":\"高级篇\",\"link\":\"/项目实战/黑马头条/高级篇\"}]},{\"text\":\"支付\",\"link\":\"/项目实战/支付\"},{\"text\":\"项目推荐\",\"link\":\"/项目实战/项目推荐\"}]},{\"text\":\"团队成员\",\"link\":\"/team\"}],\"siteTitle\":\"任硕的文档\",\"logo\":\"/Vue.png\",\"nav\":[{\"text\":\"Java学前端\",\"items\":[{\"items\":[{\"text\":\"HTML+JS\",\"link\":\"/Java学前端/HTML+JS\"},{\"text\":\"CSS\",\"link\":\"/Java学前端/CSS\"},{\"text\":\"Vue2+组件\",\"link\":\"/Java学前端/Vue2+组件\"},{\"text\":\"Vue3+组件\",\"link\":\"/Java学前端/Vue3+组件\"},{\"text\":\"React\",\"link\":\"/Java学前端/React\"}]}],\"activeMatch\":\"/Java/\"},{\"text\":\"软件测试\",\"items\":[{\"items\":[{\"text\":\"测试基础\",\"link\":\"/软件测试/测试基础\"},{\"text\":\"压力测试\",\"link\":\"/软件测试/压力测试\"}]}]},{\"text\":\"多线程\",\"items\":[{\"items\":[{\"text\":\"基础篇\",\"link\":\"/并发 & 多线程/基础篇\"},{\"text\":\"进阶篇\",\"link\":\"/并发 & 多线程/并发完善\"}]}]},{\"text\":\"开发工具\",\"items\":[{\"items\":[{\"text\":\"Chrome\",\"link\":\"/IDEA/Chrome\"},{\"text\":\"IDEA基础\",\"link\":\"/IDEA/IDEA基础\"},{\"text\":\"IDEA插件\",\"link\":\"/IDEA/IDEA插件\"},{\"text\":\"VS Code\",\"link\":\"/IDEA/VS Code\"}]}]},{\"text\":\"消息中间件\",\"items\":[{\"items\":[{\"text\":\"RabbitMQ\",\"link\":\"/消息中间件/RabbitMQ\"},{\"text\":\"RocketMQ\",\"link\":\"/消息中间件/RocketMQ\"},{\"text\":\"Kafka\",\"link\":\"/消息中间件/Kafka\"},{\"text\":\"Canal\",\"link\":\"/消息中间件/Canal\"}]}]}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/renshuo123/renshuo123.github.io\"},{\"icon\":\"twitter\",\"link\":\"#\"},{\"icon\":{\"svg\":\"<svg t=\\\"1676028692954\\\" class=\\\"icon\\\" ...</path></svg>\"},\"link\":\"https://github.com/\"}]},\"locales\":{},\"scrollOffset\":90,\"cleanUrls\":false}");</script>
    
  </body>
</html>